This is the code for the statistical analysis for Motor Speech Conference 2022.

Loading Packages


library(rio)
library(tidyverse)
library(irr)
library(performance)
library(car)
library(ggpubr)
library(corrr)
library(ggridges)
library(furniture)

Upload Datasets


Reliability <- rio::import("Prepped Data/Reliability Data.csv")
AcousticData <- rio::import("Prepped Data/AcousticMeasures.csv") 

AcousticData <- AcousticData %>%
  dplyr::filter(!grepl("_rel", Speaker)) %>%
  dplyr::select(c(Speaker, Sex, Etiology, vowel_ED_b, VSA_b, Hull_b, Hull_bVSD_25, Hull_bVSD_50, Hull_bVSD_75, VAS, transAcc))

Listeners <- rio::import("Prepped Data/Listener_Demographics.csv") %>%
  dplyr::select(!c(StartDate:proloficID, Q2.4_6_TEXT, Q3.2_8_TEXT, AudioCheck:EP3))

Listeners$race[Listeners$Q3.3_7_TEXT == "Native American/ African amercing"] <- "Biracial or Multiracial"

Inter-rater Reliability

Two raters (the first two authors) completed vowel segmentation for the speakers. To calculate inter-rater reliability, 20% of the speakers were segmented again by the other rater. Two-way intraclass coefficients were computed for the extracted F1 and F2 from the temporal midpoint of the vowel segments. Since only one set of ratings will be used in the data analysis, we focus on the single ICC results and interpretation. However, we also report the average ICC values to be comprehensive.


## Creating new data frames to calculate ICC for extracted F1 and F2 values

F1_Rel <- Reliability %>%
  dplyr::select(c(F1, F1_rel))

F2_Rel <- Reliability %>%
  dplyr::select(c(F2, F2_rel))
  
## Single ICC for F1
Single_F1 <- irr::icc(F1_Rel, model = "twoway", type = "agreement", unit = "single")

## Average ICC for F1
Average_F1 <- irr::icc(F1_Rel, model = "twoway", type = "agreement", unit = "average")

## Single ICC for F2
Single_F2 <- irr::icc(F2_Rel, model = "twoway", type = "agreement", unit = "single")

## Average ICC for F2
Average_F2 <- irr::icc(F2_Rel, model = "twoway", type = "agreement", unit = "average")

## Inter-rater reliability results and interpretation

print(paste("Single ICC for F1 is ", round(Single_F1$value, digits = 3), ". ", 
            "The 95% CI is [", round(Single_F1$lbound, digits = 3), " - ", round(Single_F1$ubound, digits = 3), "].", sep = ""))
[1] "Single ICC for F1 is 0.866. The 95% CI is [0.837 - 0.89]."
print(paste("Single ICC for F2 is ", round(Single_F2$value, digits = 3), ". ", 
            "The 95% CI is [", round(Single_F2$lbound, digits = 3), " - ", round(Single_F2$ubound, digits = 3), "].", sep = ""))
[1] "Single ICC for F2 is 0.931. The 95% CI is [0.916 - 0.944]."
print(paste("Average ICC for F1 is ", round(Average_F1$value, digits = 3), ". ", 
            "The 95% CI is [", round(Average_F1$lbound, digits = 3), " - ", round(Average_F1$ubound, digits = 3), "].", sep = ""))
[1] "Average ICC for F1 is 0.928. The 95% CI is [0.911 - 0.942]."
print(paste("Average ICC for F2 is ", round(Average_F2$value, digits = 3), ". ", 
            "The 95% CI is [", round(Average_F2$lbound, digits = 3), " - ", round(Average_F2$ubound, digits = 3), "].", sep = ""))
[1] "Average ICC for F2 is 0.964. The 95% CI is [0.956 - 0.971]."
print("Thus, interrater reliability for the extracted F1 and F2 values from the vowel segments was good to excellent.")
[1] "Thus, interrater reliability for the extracted F1 and F2 values from the vowel segments was good to excellent."
## Removing extra data frames from environment

rm(F1_Rel, F2_Rel, Reliability, Single_F1, Single_F2, Average_F1, Average_F2)

Descriptive Statistics

Means and SD


Descriptives <- AcousticData %>%
  dplyr::group_by(Sex, Etiology) %>%
  dplyr::summarize(VSA_mean = mean(VSA_b, na.rm =T), VSA_sd = sd(VSA_b, na.rm = T),
                   Disp_mean = mean(vowel_ED_b, na.rm =T), Disp_sd = sd(vowel_ED_b, na.rm =T),
                   Hull_mean = mean(Hull_b, na.rm =T), Hull_sd = sd(Hull_b, na.rm =T),
                   VSD25_mean = mean(Hull_bVSD_25, na.rm =T), VSD25_sd = sd(Hull_bVSD_25, na.rm =T),
                   VSD50_mean = mean(Hull_bVSD_50, na.rm =T), VSD50_sd = sd(Hull_bVSD_50, na.rm =T),
                   VSD75_mean = mean(Hull_bVSD_75, na.rm =T), VSD75_sd = sd(Hull_bVSD_75, na.rm =T),
                   VAS_mean = mean(VAS, na.rm =T), VAS_sd = sd(VAS, na.rm =T),
                   OT_mean = mean(transAcc, na.rm =T), OT_sd = sd(transAcc, na.rm =T))
`summarise()` has grouped output by 'Sex'. You can override using the `.groups` argument.
DescriptivesbySex <- AcousticData %>%
  dplyr::group_by(Sex) %>%
  dplyr::summarize(VSA_mean = mean(VSA_b, na.rm =T), VSA_sd = sd(VSA_b, na.rm = T),
                   Disp_mean = mean(vowel_ED_b, na.rm =T), Disp_sd = sd(vowel_ED_b, na.rm =T),
                   Hull_mean = mean(Hull_b, na.rm =T), Hull_sd = sd(Hull_b, na.rm =T),
                   VSD25_mean = mean(Hull_bVSD_25, na.rm =T), VSD25_sd = sd(Hull_bVSD_25, na.rm =T),
                   VSD50_mean = mean(Hull_bVSD_50, na.rm =T), VSD50_sd = sd(Hull_bVSD_50, na.rm =T),
                   VSD75_mean = mean(Hull_bVSD_75, na.rm =T), VSD75_sd = sd(Hull_bVSD_75, na.rm =T),
                   VAS_mean = mean(VAS, na.rm =T), VAS_sd = sd(VAS, na.rm =T),
                   OT_mean = mean(transAcc, na.rm =T), OT_sd = sd(transAcc, na.rm =T))

DescriptivesbyEtiology <- AcousticData %>%
  dplyr::group_by(Etiology) %>%
  dplyr::summarize(VSA_mean = mean(VSA_b, na.rm =T), VSA_sd = sd(VSA_b, na.rm = T),
                   Disp_mean = mean(vowel_ED_b, na.rm =T), Disp_sd = sd(vowel_ED_b, na.rm =T),
                   Hull_mean = mean(Hull_b, na.rm =T), Hull_sd = sd(Hull_b, na.rm =T),
                   VSD25_mean = mean(Hull_bVSD_25, na.rm =T), VSD25_sd = sd(Hull_bVSD_25, na.rm =T),
                   VSD50_mean = mean(Hull_bVSD_50, na.rm =T), VSD50_sd = sd(Hull_bVSD_50, na.rm =T),
                   VSD75_mean = mean(Hull_bVSD_75, na.rm =T), VSD75_sd = sd(Hull_bVSD_75, na.rm =T),
                   VAS_mean = mean(VAS, na.rm =T), VAS_sd = sd(VAS, na.rm =T),
                   OT_mean = mean(transAcc, na.rm =T), OT_sd = sd(transAcc, na.rm =T))

Descriptives

DescriptivesbySex

DescriptivesbyEtiology
NA

Correlations among variables


CorrMatrix1 <- AcousticData %>%
  dplyr::select(VSA_b, vowel_ED_b, Hull_b, Hull_bVSD_25, Hull_bVSD_50, Hull_bVSD_75, VAS, transAcc) %>%
  corrr::correlate()

Correlation method: 'pearson'
Missing treated using: 'pairwise.complete.obs'
CorrMatrix1
NA

Data Vis

Group Comparisons: Ridgeline Plots


# Vowel Space Area Distribution by Etiology

VSA_plot <- AcousticData %>%
  ggplot() +
  aes(x = VSA_b,
      y = Etiology,
      color = Etiology,
      fill = Etiology) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Area (Bark)") +
  theme_classic()

## Corner Dispersion Distribution by Etiology

disp_plot <- AcousticData %>%
  ggplot() +
  aes(x = vowel_ED_b,
      y = Etiology,
      color = Etiology,
      fill = Etiology) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Corner Dispersion (Bark)") +
  theme_classic()

# Vowel Space Hull Distribution by Etiology

Hull_plot <- AcousticData %>%
  ggplot() +
  aes(x = Hull_b,
      y = Etiology,
      color = Etiology,
      fill = Etiology) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Hull (Bark)") +
  theme_classic()

# Vowel Space Density 25 Distribution by Etiology

vsd_25_plot <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_25,
      y = Etiology,
      color = Etiology,
      fill = Etiology) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Denisty 25 (Bark)") +
  theme_classic()

# Vowel Space Density 50 Distribution by Etiology

vsd_50_plot <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_50,
      y = Etiology,
      color = Etiology,
      fill = Etiology) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Denisty 50 (Bark)") +
  theme_classic()

# Vowel Space Density 75 Distribution by Etiology

vsd_75_plot <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_75,
      y = Etiology,
      color = Etiology,
      fill = Etiology) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  expand_limits(x=0) +
  xlab("Vowel Space Denisty 75 (Bark)") +
  theme_classic()

# Visual Analog Scale Intelligibility Rating Distribution by Etiology

VAS_plot <- AcousticData %>%
  ggplot() +
  aes(x = VAS,
      y = Etiology,
      color = Etiology,
      fill = Etiology) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Visual Analog Scale (VAS)") +
  theme_classic()

# Orthographic Transcription Score Distribution by Etiology

OT_plot <- AcousticData %>%
  ggplot() +
  aes(x = transAcc,
      y = Etiology,
      color = Etiology,
      fill = Etiology) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  coord_cartesian(xlim = c(0, 100)) +
  xlab("Orthographic Transcription Scores") +
  theme_classic()

# Creating Distributions Figure

Distributions <- ggpubr::ggarrange(VSA_plot, disp_plot, Hull_plot, vsd_25_plot, vsd_50_plot, vsd_75_plot, VAS_plot, OT_plot,
                  ncol = 2,
                  nrow = 4)
Picking joint bandwidth of 0.71
Picking joint bandwidth of 0.166
Picking joint bandwidth of 4.07
Picking joint bandwidth of 3.52
Picking joint bandwidth of 1.99
Picking joint bandwidth of 0.805
Picking joint bandwidth of 11.2
Picking joint bandwidth of 9.57
# Saving Distribution Figure

ggsave("Plots/Distribution.png", plot = last_plot(), width = 10, height = 10, unit = "in")

Scatter Plots


# OT Scatterplots

OT_VSA <- AcousticData %>%
  ggplot() +
  aes(x = VSA_b,
      y = transAcc) +
  geom_point() +
  geom_smooth(method = "lm", se = T, color = "#E69F00", fill = "light grey") +
  xlab(expression("Vowel Space Area (Bark"^2*")")) +
  ylab("Percent Words Correct") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"))

OT_disp <- AcousticData %>%
  ggplot() +
  aes(x = vowel_ED_b,
      y = transAcc) +
  geom_point() +
  geom_smooth(method = "lm", se = T, color = "#56B4E9", fill = "light grey") +
  xlab("Corner Dispersion (Bark)") +
  ylab("Percent Words Correct") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()

OT_Hull <- AcousticData %>%
  ggplot() +
  aes(x = Hull_b,
      y = transAcc) +
  geom_point() +
  geom_smooth(method = "lm", se = T, color = "#009E73", fill = "light grey") +
  xlab(expression("Vowel Space Hull (Bark"^2*")")) +
  ylab("Percent Words Correct") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()

OT_vsd25 <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_25,
      y = transAcc) +
  geom_point() +
  geom_smooth(method = "lm", se = T, color = "#0072B2", fill = "light grey") +
  xlab(expression("Vowel Space Density"[25]*" (Bark"^2*")")) +
  ylab("Percent Words Correct") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()

OT_vsd75 <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_75,
      y = transAcc) +
  geom_point() +
  geom_smooth(method = "lm", se = T, color = "#D55E00", fill = "light grey") +
  xlab(expression("Vowel Space Density"[75]*" (Bark"^2*")")) +
  ylab("Percent Words Correct") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()

# Creating OT Scatterplot Figure

OT_Scatterplots <- ggpubr::ggarrange(OT_VSA, OT_disp, OT_Hull, OT_vsd25, OT_vsd75,
                                     ncol = 3, nrow = 2)
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
## Saving OT Scatterplot Figure

ggsave("Plots/OT_Scatterplots.png", plot = last_plot(), width = 15, height = 15, unit = "in", scale = 0.6)

# VAS Scatterplots

VAS_VSA <- AcousticData %>%
  ggplot() +
  aes(x = VSA_b,
      y = VAS) +
  geom_point() +
  geom_smooth(method = "lm", se = T, color = "#E69F00", fill = "light grey") +
  xlab(expression("Vowel Space Area (Bark"^2*")")) +
  ylab("VAS Rating") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"))

VAS_disp <- AcousticData %>%
  ggplot() +
  aes(x = vowel_ED_b,
      y = VAS) +
  geom_point() +
  geom_smooth(method = "lm", se = T, color = "#56B4E9", fill = "light grey") +
  xlab("Corner Dispersion (Bark)") +
  ylab("VAS Rating") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()

VAS_Hull <- AcousticData %>%
  ggplot() +
  aes(x = Hull_b,
      y = VAS) +
  geom_point() +
  geom_smooth(method = "lm", se = T, color = "#009E73", fill = "light grey") +
  xlab(expression("Vowel Space Hull (Bark"^2*")")) +
  ylab("VAS Rating") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()

VAS_vsd25 <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_25,
      y = VAS) +
  geom_point() +
  geom_smooth(method = "lm", se = T, color = "#0072B2", fill = "light grey") +
  xlab(expression("Vowel Space Density"[25]*" (Bark"^2*")")) +
  ylab("VAS Rating") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()

VAS_vsd75 <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_75,
      y = VAS) +
  geom_point() +
  geom_smooth(method = "lm", se = T, color = "#D55E00", fill = "light grey") +
  xlab(expression("Vowel Space Density"[75]*" (Bark"^2*")")) +
  ylab("VAS Rating") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()

# Creating VAS Scatterplot Figure

VAS_Scatterplots <- ggpubr::ggarrange(VAS_VSA, VAS_disp, VAS_Hull, VAS_vsd25, VAS_vsd75,
                  ncol = 3, nrow = 2)

## Saving VAS Scatterplot Figure

ggsave("Plots/VAS_Scatterplots.png", plot = last_plot(), width = 15, height = 15, unit = "in", scale = .6)

OT ~ VAS Plot


# VAS ~ OT Plot

VAS_OT <- AcousticData %>%
  ggplot() +
  aes(x = VAS,
      y = transAcc) +
  geom_point() +
  geom_smooth(method = "lm", se = T, color = "#CC79A7", fill = "light grey") + 
  ggtitle("Relationship Between Intelligibility Measures") +
  xlab("VAS Rating") +
  ylab("Percent Words Correct") +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"))

# Saving OT ~ VAS Plot

ggsave("Plots/OTvas.png", plot = last_plot(), width = 8, height = 8, unit = "in", scale = 0.6)
  
# OT ~ VAS by Sex

VAS_OT_Sex <- AcousticData %>%
  ggplot() +
  aes(x = VAS,
      y = transAcc,
      color = Sex) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("VAS Rating") +
  ylab("Percent Words Correct") +
  theme_classic()

ggsave("Plots/OTvas_sex.png", plot = last_plot(), width = 5, height = 5, unit = "in", scale = 0.6)

# OT ~ VAS by Etiology

VAS_OT_Etiology <- AcousticData %>%
  ggplot() +
  aes(x = VAS,
      y = transAcc,
      color = Etiology) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("VAS Rating") +
  ylab("Percent Words Correct") +
  theme_classic()

ggsave("Plots/OTvas_etiology.png", plot = last_plot(), width = 5, height = 5, unit = "in", scale = 0.6)

Group Comparisons

VSA


## Specify the Model
VSA_group <- aov(VSA_b ~ Etiology, data = AcousticData)

## Assumption Check

plot(VSA_group, 1)

plot(VSA_group, 2)

car::leveneTest(VSA_group)
group coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  3  0.5761 0.6344
      36               
VSA_residuals <- residuals(object = VSA_group)
shapiro.test(VSA_residuals)

    Shapiro-Wilk normality test

data:  VSA_residuals
W = 0.89408, p-value = 0.001292
## Model Results

summary(VSA_group)
            Df Sum Sq Mean Sq F value Pr(>F)  
Etiology     3   31.6  10.532   2.795 0.0541 .
Residuals   36  135.7   3.768                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
## Kruskal-Wallis Test 

kruskal.test(VSA_b ~ Etiology, data = AcousticData)

    Kruskal-Wallis rank sum test

data:  VSA_b by Etiology
Kruskal-Wallis chi-squared = 8.978, df = 3, p-value = 0.02958
## Pairwise Comparisons

pairwise.wilcox.test(AcousticData$VSA_b, AcousticData$Etiology, p.adjust.method = "bonferroni")

    Pairwise comparisons using Wilcoxon rank sum exact test 

data:  AcousticData$VSA_b and AcousticData$Etiology 

       ALS   Ataxic HD   
Ataxic 0.069 -      -    
HD     0.054 1.000  -    
PD     1.000 0.738  0.738

P value adjustment method: bonferroni 

Corner Dispersion


## Specify the Model
disp_group <- aov(vowel_ED_b ~ Etiology, data = AcousticData)

## Assumption Check

plot(disp_group, 1)

plot(disp_group, 2)

car::leveneTest(disp_group)
group coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  3  0.5502 0.6513
      36               
disp_residuals <- residuals(object = disp_group)
shapiro.test(disp_residuals)

    Shapiro-Wilk normality test

data:  disp_residuals
W = 0.98237, p-value = 0.7765
## Model Results

summary(disp_group)
            Df Sum Sq Mean Sq F value Pr(>F)
Etiology     3  0.768  0.2559   1.749  0.174
Residuals   36  5.267  0.1463               

Hull


## Specify the Model
hull_group <- aov(Hull_b ~ Etiology, data = AcousticData)

## Assumption Check

plot(hull_group, 1)

plot(hull_group, 2)

car::leveneTest(hull_group)
group coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value  Pr(>F)  
group  3  2.5009 0.07492 .
      36                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
hull_residuals <- residuals(object = hull_group)
shapiro.test(hull_residuals)

    Shapiro-Wilk normality test

data:  hull_residuals
W = 0.96952, p-value = 0.3474
## Model Results

summary(hull_group)
            Df Sum Sq Mean Sq F value Pr(>F)
Etiology     3  446.2  148.72   2.093  0.118
Residuals   36 2558.2   71.06               

VSD 25


## Specify the Model
vsd25_group <- aov(Hull_bVSD_25 ~ Etiology, data = AcousticData)

## Assumption Check

plot(vsd25_group, 1)

plot(vsd25_group, 2)

car::leveneTest(vsd25_group)
group coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  3  0.1853 0.9057
      36               
vsd25_residuals <- residuals(object = vsd25_group)
shapiro.test(vsd25_residuals)

    Shapiro-Wilk normality test

data:  vsd25_residuals
W = 0.95627, p-value = 0.1247
## Model Summary

summary(vsd25_group)
            Df Sum Sq Mean Sq F value Pr(>F)
Etiology     3  133.3   44.42   0.977  0.414
Residuals   36 1636.6   45.46               

VSD 50


## Specify the Model
vsd50_group <- aov(Hull_bVSD_50 ~ Etiology, data = AcousticData)

## Assumption Check

plot(vsd50_group, 1)

plot(vsd50_group, 2)

car::leveneTest(vsd50_group)
group coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  3  1.0748  0.372
      36               
vsd50_residuals <- residuals(object = vsd50_group)
shapiro.test(vsd50_residuals)

    Shapiro-Wilk normality test

data:  vsd50_residuals
W = 0.92221, p-value = 0.009043
## Model Results

summary(vsd50_group)
            Df Sum Sq Mean Sq F value Pr(>F)
Etiology     3   65.2   21.74   1.149  0.342
Residuals   36  681.0   18.92               
## Kruskal Wallis Test

kruskal.test(Hull_bVSD_50 ~ Etiology, data = AcousticData)

    Kruskal-Wallis rank sum test

data:  Hull_bVSD_50 by Etiology
Kruskal-Wallis chi-squared = 3.341, df = 3, p-value = 0.342

VSD 75


## Specify the Model
vsd75_group <- aov(Hull_bVSD_75 ~ Etiology, data = AcousticData)

## Assumption Check

plot(vsd75_group, 1)

plot(vsd75_group, 2)

car::leveneTest(vsd75_group)
group coerced to factor.
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  3  0.8627 0.4693
      36               
vsd75_residuals <- residuals(object = vsd75_group)
shapiro.test(vsd75_residuals)

    Shapiro-Wilk normality test

data:  vsd75_residuals
W = 0.84762, p-value = 7.879e-05
## Model Summary

summary(vsd75_group)
            Df Sum Sq Mean Sq F value Pr(>F)
Etiology     3  17.35   5.783   1.148  0.343
Residuals   36 181.31   5.036               
## Kruskal Wallis

kruskal.test(Hull_bVSD_75 ~ Etiology, data = AcousticData)

    Kruskal-Wallis rank sum test

data:  Hull_bVSD_75 by Etiology
Kruskal-Wallis chi-squared = 3.7127, df = 3, p-value = 0.2942

VAS


## Specify the Model
VAS_group <- aov(VAS ~ Sex*Etiology, data = AcousticData)

## Assumption Check

plot(VAS_group, 1)

plot(VAS_group, 2)

car::leveneTest(VAS_group)
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  7   0.654 0.7084
      32               
VAS_residuals <- residuals(object = VAS_group)
shapiro.test(VAS_residuals)

    Shapiro-Wilk normality test

data:  VAS_residuals
W = 0.94633, p-value = 0.05674
## Model Results

summary(VAS_group)
             Df Sum Sq Mean Sq F value Pr(>F)
Sex           1    501   500.6   0.722  0.402
Etiology      3   2975   991.5   1.431  0.252
Sex:Etiology  3   1253   417.8   0.603  0.618
Residuals    32  22179   693.1               

OT


## Specify the Model
OT_group <- aov(transAcc ~ Sex*Etiology, data = AcousticData)

## Assumption Check

plot(OT_group, 1)

plot(OT_group, 2)

car::leveneTest(OT_group)
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  7  0.5655 0.7781
      32               
OT_residuals <- residuals(object = OT_group)
shapiro.test(OT_residuals)

    Shapiro-Wilk normality test

data:  OT_residuals
W = 0.93272, p-value = 0.01978
## Model Results

summary(OT_group)
             Df Sum Sq Mean Sq F value Pr(>F)
Sex           1    415   414.9   0.685  0.414
Etiology      3   2170   723.5   1.195  0.327
Sex:Etiology  3    337   112.2   0.185  0.906
Residuals    32  19377   605.5               

Modeling Intelligibility

Orthographic Transcriptions

Model 1


# Specifying Model 1

OT_Model1 <- lm(transAcc ~ Hull_bVSD_25, data = AcousticData)

## Model 1 Assumptions 

performance::check_model(OT_Model1)


## Model 1 Summary

summary(OT_Model1)

Call:
lm(formula = transAcc ~ Hull_bVSD_25, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-47.896 -14.090   5.996  17.470  36.105 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)   48.2973     9.7372   4.960  1.5e-05 ***
Hull_bVSD_25   0.6417     0.5663   1.133    0.264    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 23.83 on 38 degrees of freedom
Multiple R-squared:  0.03268,   Adjusted R-squared:  0.007224 
F-statistic: 1.284 on 1 and 38 DF,  p-value: 0.2643

Model 2


## Specifying Model 2

OT_Model2 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75, data = AcousticData)

## Model 2 Assumption Check

performance::check_model(OT_Model2)


## Model 2 Summary

summary(OT_Model2)

Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-48.854 -13.962   5.567  16.758  36.257 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)   47.3374    10.3316   4.582 5.09e-05 ***
Hull_bVSD_25   0.8045     0.7781   1.034    0.308    
Hull_bVSD_75  -0.7188     2.3225  -0.309    0.759    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 24.11 on 37 degrees of freedom
Multiple R-squared:  0.03518,   Adjusted R-squared:  -0.01698 
F-statistic: 0.6745 on 2 and 37 DF,  p-value: 0.5156
## Model 1 and Model 2 Comparison

anova(OT_Model1, OT_Model2)
Analysis of Variance Table

Model 1: transAcc ~ Hull_bVSD_25
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     38 21570                           
2     37 21514  1    55.696 0.0958 0.7587

Model 3


## Specifying Model 3

OT_Model3 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b, data = AcousticData)

## Model 3 Assumption Check

performance::check_model(OT_Model3)


## Model 3 Summary

summary(OT_Model3)

Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b, 
    data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-56.706 -13.157   7.018  17.957  29.990 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept)   31.0806    14.4916   2.145   0.0388 *
Hull_bVSD_25  -0.8439     1.2984  -0.650   0.5199  
Hull_bVSD_75   0.3159     2.3714   0.133   0.8948  
Hull_b         1.2941     0.8247   1.569   0.1253  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 23.65 on 36 degrees of freedom
Multiple R-squared:  0.09695,   Adjusted R-squared:  0.0217 
F-statistic: 1.288 on 3 and 36 DF,  p-value: 0.2932
## Model 2 and Model 3 Comparison

anova(OT_Model2, OT_Model3)
Analysis of Variance Table

Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     37 21514                           
2     36 20137  1    1377.5 2.4626 0.1253

Model 4


## Specifying Model 4

OT_Model4 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b, data = AcousticData)

## Model 4 Assumption Check

performance::check_model(OT_Model4)


## Model 4 Summary

summary(OT_Model4)

Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + 
    VSA_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-44.796 -11.144   3.042  12.567  34.297 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
(Intercept)   27.4533    13.1156   2.093  0.04365 * 
Hull_bVSD_25  -1.2602     1.1782  -1.070  0.29214   
Hull_bVSD_75   0.5663     2.1390   0.265  0.79274   
Hull_b         0.7364     0.7654   0.962  0.34261   
VSA_b          6.0896     1.9954   3.052  0.00432 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 21.32 on 35 degrees of freedom
Multiple R-squared:  0.2868,    Adjusted R-squared:  0.2052 
F-statistic: 3.518 on 4 and 35 DF,  p-value: 0.01626
## Model 3 and Model 4 Comparison

anova(OT_Model3, OT_Model4)
Analysis of Variance Table

Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b
  Res.Df   RSS Df Sum of Sq     F   Pr(>F)   
1     36 20137                               
2     35 15904  1    4232.4 9.314 0.004321 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model 5


## Specifying Model 5

OT_Model5 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b, data = AcousticData)

## Model 4 Assumption Check

performance::check_model(OT_Model5)


## Model 4 Summary

summary(OT_Model5)

Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + 
    VSA_b + vowel_ED_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-46.533 -11.028   3.327  13.017  33.227 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept)   20.3598    21.5072   0.947   0.3505  
Hull_bVSD_25  -1.2567     1.1924  -1.054   0.2994  
Hull_bVSD_75   0.7007     2.1882   0.320   0.7508  
Hull_b         0.6895     0.7826   0.881   0.3845  
VSA_b          5.3903     2.6194   2.058   0.0473 *
vowel_ED_b     5.5182    13.1650   0.419   0.6777  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 21.57 on 34 degrees of freedom
Multiple R-squared:  0.2904,    Adjusted R-squared:  0.1861 
F-statistic: 2.783 on 5 and 34 DF,  p-value: 0.03271
## Model 3 and Model 4 Comparison

anova(OT_Model4, OT_Model5)
Analysis of Variance Table

Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     35 15904                           
2     34 15823  1    81.764 0.1757 0.6777

Final Model


## Specifying Final Model

OT_Model_final <- lm(transAcc ~ VSA_b, data = AcousticData)

## Final Model Assumption Check

performance::check_model(OT_Model_final)


## Final Model Summary

summary(OT_Model_final)

Call:
lm(formula = transAcc ~ VSA_b, data = AcousticData)

Residuals:
   Min     1Q Median     3Q    Max 
-46.72 -12.69   2.97  14.37  35.39 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   32.508      7.857   4.138 0.000187 ***
VSA_b          5.872      1.613   3.641 0.000807 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 20.86 on 38 degrees of freedom
Multiple R-squared:  0.2586,    Adjusted R-squared:  0.2391 
F-statistic: 13.25 on 1 and 38 DF,  p-value: 0.0008068

VAS Models

Model 1


# Specifying Model 1

VAS_Model1 <- lm(VAS ~ Hull_bVSD_25, data = AcousticData)

## Model 1 Assumptions 

performance::check_model(VAS_Model1)


## Model 1 Summary

summary(VAS_Model1)

Call:
lm(formula = VAS ~ Hull_bVSD_25, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-47.625 -16.684   8.462  19.440  37.352 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)   42.6328    10.7512   3.965 0.000313 ***
Hull_bVSD_25   0.5877     0.6253   0.940 0.353236    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 26.31 on 38 degrees of freedom
Multiple R-squared:  0.02272,   Adjusted R-squared:  -0.003001 
F-statistic: 0.8833 on 1 and 38 DF,  p-value: 0.3532

Model 2


## Specifying Model 2

VAS_Model2 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75, data = AcousticData)

## Model 2 Assumption Check

performance::check_model(VAS_Model2)


## Model 2 Summary

summary(VAS_Model2)

Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-47.850 -16.576   8.382  19.448  37.237 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)   42.3384    11.4211   3.707 0.000684 ***
Hull_bVSD_25   0.6376     0.8602   0.741 0.463195    
Hull_bVSD_75  -0.2204     2.5674  -0.086 0.932036    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 26.66 on 37 degrees of freedom
Multiple R-squared:  0.02291,   Adjusted R-squared:  -0.0299 
F-statistic: 0.4338 on 2 and 37 DF,  p-value: 0.6513
## Model 1 and Model 2 Comparison

anova(VAS_Model1, VAS_Model2)
Analysis of Variance Table

Model 1: VAS ~ Hull_bVSD_25
Model 2: VAS ~ Hull_bVSD_25 + Hull_bVSD_75
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     38 26296                           
2     37 26291  1     5.239 0.0074  0.932

Model 3


## Specifying Model 3

VAS_Model3 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b, data = AcousticData)

## Model 3 Assumption Check

performance::check_model(VAS_Model3)


## Model 3 Summary

summary(VAS_Model3)

Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-56.444 -18.989   6.121  18.036  32.281 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)
(Intercept)   25.0400    16.0599   1.559    0.128
Hull_bVSD_25  -1.1164     1.4389  -0.776    0.443
Hull_bVSD_75   0.8805     2.6280   0.335    0.740
Hull_b         1.3770     0.9139   1.507    0.141

Residual standard error: 26.21 on 36 degrees of freedom
Multiple R-squared:  0.08087,   Adjusted R-squared:  0.00428 
F-statistic: 1.056 on 3 and 36 DF,  p-value: 0.3799
## Model 2 and Model 3 Comparison

anova(VAS_Model2, VAS_Model3)
Analysis of Variance Table

Model 1: VAS ~ Hull_bVSD_25 + Hull_bVSD_75
Model 2: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     37 26291                           
2     36 24731  1    1559.6 2.2702 0.1406

Model 4


## Specifying Model 4

VAS_Model4 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b, data = AcousticData)

## Model 4 Assumption Check

performance::check_model(VAS_Model4)


## Model 4 Summary

summary(VAS_Model4)

Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b, 
    data = AcousticData)

Residuals:
   Min     1Q Median     3Q    Max 
-42.25 -14.17   5.76  16.26  41.48 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
(Intercept)   21.0802    14.5922   1.445  0.15746   
Hull_bVSD_25  -1.5708     1.3109  -1.198  0.23885   
Hull_bVSD_75   1.1539     2.3798   0.485  0.63078   
Hull_b         0.7682     0.8516   0.902  0.37320   
VSA_b          6.6479     2.2200   2.995  0.00502 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 23.72 on 35 degrees of freedom
Multiple R-squared:  0.2683,    Adjusted R-squared:  0.1847 
F-statistic: 3.209 on 4 and 35 DF,  p-value: 0.02405
## Model 3 and Model 4 Comparison

anova(VAS_Model3, VAS_Model4)
Analysis of Variance Table

Model 1: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b
Model 2: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b
  Res.Df   RSS Df Sum of Sq      F  Pr(>F)   
1     36 24731                               
2     35 19687  1    5043.9 8.9671 0.00502 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model 5


## Specifying Model 5

VAS_Model5 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b, data = AcousticData)

## Model 5 Assumption Check

performance::check_model(VAS_Model5)


## Model 5 Summary

summary(VAS_Model5)

Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + 
    vowel_ED_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-44.569 -13.697   5.187  16.183  40.204 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept)   12.6419    23.9197   0.529   0.6006  
Hull_bVSD_25  -1.5667     1.3261  -1.181   0.2456  
Hull_bVSD_75   1.3137     2.4337   0.540   0.5928  
Hull_b         0.7124     0.8704   0.818   0.4188  
VSA_b          5.8159     2.9132   1.996   0.0539 .
vowel_ED_b     6.5644    14.6417   0.448   0.6568  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 23.99 on 34 degrees of freedom
Multiple R-squared:  0.2726,    Adjusted R-squared:  0.1657 
F-statistic: 2.549 on 5 and 34 DF,  p-value: 0.0461
## Model 4 and Model 5 Comparison

anova(VAS_Model4, VAS_Model5)
Analysis of Variance Table

Model 1: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b
Model 2: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b
  Res.Df   RSS Df Sum of Sq     F Pr(>F)
1     35 19687                          
2     34 19572  1     115.7 0.201 0.6568

Final Model


## Specifying Final Model

VAS_Model_final <- lm(VAS ~ VSA_b, data = AcousticData)

## Final Model Assumption Check

performance::check_model(VAS_Model_final)


## Final Model Summary

summary(VAS_Model_final)

Call:
lm(formula = VAS ~ VSA_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-44.956 -15.943   6.754  17.153  43.062 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept)   24.703      8.761   2.820  0.00760 **
VSA_b          6.163      1.798   3.427  0.00148 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 23.26 on 38 degrees of freedom
Multiple R-squared:  0.2361,    Adjusted R-squared:  0.216 
F-statistic: 11.74 on 1 and 38 DF,  p-value: 0.001482

Relationship between OT and VAS

Tested Model


# Specify Model

OT_VAS_model <- lm(transAcc ~ VAS*Etiology + VAS*Sex, data = AcousticData)

# Assumption Check

performance::check_model(OT_VAS_model)


# Model Results

summary(OT_VAS_model)

Call:
lm(formula = transAcc ~ VAS * Etiology + VAS * Sex, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-14.910  -4.525  -1.280   5.529  16.932 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)        10.8993562  5.7092981   1.909   0.0659 .  
VAS                 0.8924319  0.1276625   6.991  9.1e-08 ***
EtiologyAtaxic      2.9854239  9.5149402   0.314   0.7559    
EtiologyHD          2.1009983  7.3948950   0.284   0.7783    
EtiologyPD         -2.4903757 10.1590855  -0.245   0.8080    
SexM                6.8939642  7.0796700   0.974   0.3380    
VAS:EtiologyAtaxic -0.0019088  0.1791048  -0.011   0.9916    
VAS:EtiologyHD      0.0007804  0.1453318   0.005   0.9958    
VAS:EtiologyPD      0.0320470  0.1732105   0.185   0.8545    
VAS:SexM           -0.1220661  0.1241230  -0.983   0.3333    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 8.488 on 30 degrees of freedom
Multiple R-squared:  0.9031,    Adjusted R-squared:  0.874 
F-statistic: 31.06 on 9 and 30 DF,  p-value: 8.181e-13

Final Model


# Specify Final Model

OT_VAS_final <- lm(transAcc ~ VAS, data = AcousticData)

# Model Results

summary(OT_VAS_final)

Call:
lm(formula = transAcc ~ VAS, data = AcousticData)

Residuals:
     Min       1Q   Median       3Q      Max 
-13.6882  -4.9316  -0.4408   4.9974  17.2110 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 13.74548    2.78681   4.932 1.64e-05 ***
VAS          0.86093    0.04799  17.938  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7.873 on 38 degrees of freedom
Multiple R-squared:  0.8944,    Adjusted R-squared:  0.8916 
F-statistic: 321.8 on 1 and 38 DF,  p-value: < 2.2e-16

Alternate Analysis

In this alternate analysis, we are looking at the relationship between these acoustic measures with speech intelligibility for the ALS/PD and the HD/Ataxic speakers separately. We create a new variable called Incoord, where the ALS/PD Speakers are set as the reference group (in order to compare to the Ataxic/HD Speaker Group). Group Comparisons, additional data visualizations, and further linear model comparisons are completed.

Data Prep


# Creating a new variable in AcousticData. Incoord is a dummy variable. ALS/PD Speakers = 0, HD/Ataxic = 1

AcousticData <- AcousticData %>%
  dplyr::mutate(Incoord = case_when(Etiology == "HD" ~ 1,
                                    Etiology == "Ataxic" ~ 1,
                                    TRUE ~ 0)) %>%
  dplyr::mutate(Incoord = as.factor(Incoord))

Descriptives


Descriptives_ALS.PD_incoord <- AcousticData %>%
  dplyr::group_by(Incoord) %>%
  dplyr::summarize(VSA_mean = mean(VSA_b, na.rm =T), VSA_sd = sd(VSA_b, na.rm = T),
                   Disp_mean = mean(vowel_ED_b, na.rm =T), Disp_sd = sd(vowel_ED_b, na.rm =T),
                   Hull_mean = mean(Hull_b, na.rm =T), Hull_sd = sd(Hull_b, na.rm =T),
                   VSD25_mean = mean(Hull_bVSD_25, na.rm =T), VSD25_sd = sd(Hull_bVSD_25, na.rm =T),
                   VSD50_mean = mean(Hull_bVSD_50, na.rm =T), VSD50_sd = sd(Hull_bVSD_50, na.rm =T),
                   VSD75_mean = mean(Hull_bVSD_75, na.rm =T), VSD75_sd = sd(Hull_bVSD_75, na.rm =T),
                   VAS_mean = mean(VAS, na.rm =T), VAS_sd = sd(VAS, na.rm =T),
                   OT_mean = mean(transAcc, na.rm =T), OT_sd = sd(transAcc, na.rm =T))

Descriptives_ALS.PD_incoord
NA

Data Vis

Group Comparison Ridgeline Plots


# VSA Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

VSA_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = VSA_b,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Area (Bark)") +
  theme_classic()

# Corner Dispersion Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

disp_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = vowel_ED_b,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Corner Dispersion (Bark)") +
  theme_classic()

# Hull Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

hull_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = Hull_b,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Hull (Bark)") +
  theme_classic()

# VSD 25 Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

vsd25_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_25,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Desnity 25 (Bark)") +
  theme_classic()

# VSD 50 Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

vsd50_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_50,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Desnity 50 (Bark)") +
  theme_classic()

# VSD 75 Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

vsd75_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_75,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Desnity 75 (Bark)") +
  theme_classic()

# Orthographic Transcription Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

OT_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = transAcc,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Percent Words Correct") +
  theme_classic()

# Visual Analog Scale Intelligibility Rating Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

VAS_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = VAS,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Ratigns") +
  theme_classic()

# Creating Distributions by Incoord Figure

Distributions_incoord <- ggpubr::ggarrange(VSA_incoord.plot, disp_incoord.plot, hull_incoord.plot, vsd25_incoord.plot, vsd50_incoord.plot, vsd75_incoord.plot, OT_incoord.plot, VAS_incoord.plot,
                  ncol = 2,
                  nrow = 4)
Picking joint bandwidth of 0.637
Picking joint bandwidth of 0.144
Picking joint bandwidth of 3.74
Picking joint bandwidth of 3.27
Picking joint bandwidth of 1.93
Picking joint bandwidth of 0.764
Picking joint bandwidth of 10.1
Picking joint bandwidth of 13
# Saving Distribution Figure

ggsave("Plots/Distribution_incoord.png", plot = last_plot(), width = 10, height = 10, unit = "in")

Scatterplots


# OT Scatterplots by Incoord

OT_VSA.incoord <- AcousticData %>%
  ggplot() +
  aes(x = VSA_b,
      y = transAcc,
      color = Incoord) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("Vowel Space Area (Bark)") +
  ylab("Percent Words Correct") +
  ggtitle("Orthographic Transcription") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"))

OT_disp.incoord <- AcousticData %>%
  ggplot() +
  aes(x = vowel_ED_b,
      y = transAcc,
      color = Incoord) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("Corner Dispersion (Bark)") +
  ylab("Percent Words Correct") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()

OT_Hull.incoord <- AcousticData %>%
  ggplot() +
  aes(x = Hull_b,
      y = transAcc,
      color = Incoord) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("Vowel Space Hull (Bark)") +
  ylab("Percent Words Correct") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()

OT_vsd25.incoord <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_25,
      y = transAcc,
      color = Incoord) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("Vowel Space Density 25 (Bark)") +
  ylab("Percent Words Correct") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()

OT_vsd75.incoord <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_75,
      y = transAcc,
      color = Incoord) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("Vowel Space Density 75 (Bark)") +
  ylab("Percent Words Correct") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()


# VAS Scatterplots

VAS_VSA.incoord <- AcousticData %>%
  ggplot() +
  aes(x = VSA_b,
      y = VAS,
      color = Incoord) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("Vowel Space Area (Bark)") +
  ylab("VAS Score") +
  ggtitle("Visual Analog Scale") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"))

VAS_disp.incoord <- AcousticData %>%
  ggplot() +
  aes(x = vowel_ED_b,
      y = VAS,
      color = Incoord) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("Corner Dispersion (Bark)") +
  ylab("VAS Score") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()

VAS_Hull.incoord <- AcousticData %>%
  ggplot() +
  aes(x = Hull_b,
      y = VAS,
      color = Incoord) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("Vowel Space Hull (Bark)") +
  ylab("VAS Score") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()

VAS_vsd25.incoord <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_25,
      y = VAS,
      color = Incoord) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("Vowel Space Density 25 (Bark)") +
  ylab("VAS Score") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()

VAS_vsd75.incoord <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_75,
      y = VAS,
      color = Incoord) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("Vowel Space Density 75 (Bark)") +
  ylab("VAS Score") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()


# Creating Scatterplot Figure

Scatterplots_incoord <- ggpubr::ggarrange(OT_VSA.incoord, VAS_VSA.incoord, OT_disp.incoord, VAS_disp.incoord, OT_Hull.incoord, VAS_Hull.incoord, OT_vsd25.incoord, VAS_vsd25.incoord, OT_vsd75.incoord, VAS_vsd75.incoord,
                  ncol = 2,
                  nrow = 5)
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
## Saving Scatterplot Figure

ggsave("Plots/Scatterplots_incoord.png", plot = last_plot(), width = 15, height = 20, unit = "in", scale = .5)

Group Comparisons

Two Dataframes for Incoord Groups


coord.group <- AcousticData %>%
  dplyr::filter(Incoord == 0)

incoord.group <- AcousticData %>%
  dplyr::filter(Incoord == 1)

VSA


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(VSA_b[Incoord == 0]))

    Shapiro-Wilk normality test

data:  VSA_b[Incoord == 0]
W = 0.94206, p-value = 0.2622
with(AcousticData, shapiro.test(VSA_b[Incoord == 1]))

    Shapiro-Wilk normality test

data:  VSA_b[Incoord == 1]
W = 0.81843, p-value = 0.001648
## Equal Variance Check

res.ftest.VSA <- var.test(VSA_b ~ Incoord, data = AcousticData)
res.ftest.VSA

    F test to compare two variances

data:  VSA_b by Incoord
F = 0.66898, num df = 19, denom df = 19, p-value = 0.3888
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.2647915 1.6901522
sample estimates:
ratio of variances 
         0.6689828 
# Model Results

VSA_b_t <- t.test(incoord.group$VSA_b, coord.group$VSA_b, var.equal = T)
VSA_b_t

    Two Sample t-test

data:  incoord.group$VSA_b and coord.group$VSA_b
t = 2.8889, df = 38, p-value = 0.006352
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.519310 2.951478
sample estimates:
mean of x mean of y 
 5.289125  3.553732 

Corner Dispersion


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(vowel_ED_b[Incoord == 0]))

    Shapiro-Wilk normality test

data:  vowel_ED_b[Incoord == 0]
W = 0.93799, p-value = 0.2197
with(AcousticData, shapiro.test(vowel_ED_b[Incoord == 1]))

    Shapiro-Wilk normality test

data:  vowel_ED_b[Incoord == 1]
W = 0.9837, p-value = 0.9725
## Equal Variance Check

res.ftest.disp <- var.test(vowel_ED_b ~ Incoord, data = AcousticData)
res.ftest.disp

    F test to compare two variances

data:  vowel_ED_b by Incoord
F = 1.2328, num df = 19, denom df = 19, p-value = 0.6528
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.4879679 3.1146765
sample estimates:
ratio of variances 
          1.232827 
# Model Results

disp_t <- t.test(incoord.group$vowel_ED_b, coord.group$vowel_ED_b, var.equal = T)
disp_t

    Two Sample t-test

data:  incoord.group$vowel_ED_b and coord.group$vowel_ED_b
t = 2.031, df = 38, p-value = 0.04929
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.000790061 0.485404644
sample estimates:
mean of x mean of y 
 2.165220  1.922123 

Hull


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(Hull_b[Incoord == 0]))

    Shapiro-Wilk normality test

data:  Hull_b[Incoord == 0]
W = 0.93152, p-value = 0.1652
with(AcousticData, shapiro.test(Hull_b[Incoord == 1]))

    Shapiro-Wilk normality test

data:  Hull_b[Incoord == 1]
W = 0.96708, p-value = 0.6923
## Equal Variance Check

res.ftest.hull <- var.test(Hull_b ~ Incoord, data = AcousticData)
res.ftest.hull

    F test to compare two variances

data:  Hull_b by Incoord
F = 1.7881, num df = 19, denom df = 19, p-value = 0.2144
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.7077388 4.5174646
sample estimates:
ratio of variances 
          1.788067 
# Model Results

hull_t <- t.test(incoord.group$Hull_b, coord.group$Hull_b, var.equal = T)
hull_t

    Two Sample t-test

data:  incoord.group$Hull_b and coord.group$Hull_b
t = 2.4391, df = 38, p-value = 0.0195
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
  1.084279 11.670189
sample estimates:
mean of x mean of y 
 34.14243  27.76520 

VSD 25


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(Hull_bVSD_25[Incoord == 0]))

    Shapiro-Wilk normality test

data:  Hull_bVSD_25[Incoord == 0]
W = 0.93529, p-value = 0.1951
with(AcousticData, shapiro.test(Hull_bVSD_25[Incoord == 1]))

    Shapiro-Wilk normality test

data:  Hull_bVSD_25[Incoord == 1]
W = 0.966, p-value = 0.6692
## Equal Variance Check

res.ftest.vsd25 <- var.test(Hull_bVSD_25 ~ Incoord, data = AcousticData)
res.ftest.vsd25

    F test to compare two variances

data:  Hull_bVSD_25 by Incoord
F = 1.2396, num df = 19, denom df = 19, p-value = 0.6444
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.4906358 3.1317059
sample estimates:
ratio of variances 
          1.239567 
# Model Results

vsd25_t <- t.test(incoord.group$Hull_bVSD_25, coord.group$Hull_bVSD_25, var.equal = T)
vsd25_t

    Two Sample t-test

data:  incoord.group$Hull_bVSD_25 and coord.group$Hull_bVSD_25
t = 1.4368, df = 38, p-value = 0.159
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -1.234943  7.274708
sample estimates:
mean of x mean of y 
 17.36480  14.34491 

VSD 50


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(Hull_bVSD_50[Incoord == 0]))

    Shapiro-Wilk normality test

data:  Hull_bVSD_50[Incoord == 0]
W = 0.87217, p-value = 0.01283
with(AcousticData, shapiro.test(Hull_bVSD_50[Incoord == 1]))

    Shapiro-Wilk normality test

data:  Hull_bVSD_50[Incoord == 1]
W = 0.90708, p-value = 0.05609
## Equal Variance Check

res.ftest.vsd50 <- var.test(Hull_bVSD_50 ~ Incoord, data = AcousticData)
res.ftest.vsd50

    F test to compare two variances

data:  Hull_bVSD_50 by Incoord
F = 0.57467, num df = 19, denom df = 19, p-value = 0.2363
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.2274606 1.4518708
sample estimates:
ratio of variances 
         0.5746681 
# Model Results (Mann-Whitney U test conducted since assumption of normality is violated)

vsd50_MW <- wilcox.test(Hull_bVSD_50 ~ Incoord, data = AcousticData)
vsd50_MW

    Wilcoxon rank sum exact test

data:  Hull_bVSD_50 by Incoord
W = 151, p-value = 0.1918
alternative hypothesis: true location shift is not equal to 0

VSD 75


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(Hull_bVSD_75[Incoord == 0]))

    Shapiro-Wilk normality test

data:  Hull_bVSD_75[Incoord == 0]
W = 0.69079, p-value = 3.017e-05
with(AcousticData, shapiro.test(Hull_bVSD_75[Incoord == 1]))

    Shapiro-Wilk normality test

data:  Hull_bVSD_75[Incoord == 1]
W = 0.84373, p-value = 0.004193
## Equal Variance Check

res.ftest.vsd75 <- var.test(Hull_bVSD_75 ~ Incoord, data = AcousticData)
res.ftest.vsd75

    F test to compare two variances

data:  Hull_bVSD_75 by Incoord
F = 1.1578, num df = 19, denom df = 19, p-value = 0.7527
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.4582864 2.9252210
sample estimates:
ratio of variances 
          1.157838 
# Model Results (Mann-Whitney U test conducted since assumption of normality is violated)

vsd75_MW <- wilcox.test(Hull_bVSD_75 ~ Incoord, data = AcousticData)
vsd75_MW

    Wilcoxon rank sum exact test

data:  Hull_bVSD_75 by Incoord
W = 160, p-value = 0.2888
alternative hypothesis: true location shift is not equal to 0

Orthographic Transcription Scores


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(transAcc[Incoord == 0]))

    Shapiro-Wilk normality test

data:  transAcc[Incoord == 0]
W = 0.87029, p-value = 0.01189
with(AcousticData, shapiro.test(transAcc[Incoord == 1]))

    Shapiro-Wilk normality test

data:  transAcc[Incoord == 1]
W = 0.91581, p-value = 0.0823
## Equal Variance Check

res.ftest.OT <- var.test(transAcc ~ Incoord, data = AcousticData)
res.ftest.OT

    F test to compare two variances

data:  transAcc by Incoord
F = 1.082, num df = 19, denom df = 19, p-value = 0.8654
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.4282721 2.7336414
sample estimates:
ratio of variances 
          1.082009 
# Model Results (Mann-Whitney U test conducted since assumption of normality is violated)

OT_MW <- wilcox.test(transAcc ~ Incoord, data = AcousticData)
OT_MW

    Wilcoxon rank sum exact test

data:  transAcc by Incoord
W = 194, p-value = 0.8831
alternative hypothesis: true location shift is not equal to 0

VAS


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(VAS[Incoord == 0]))

    Shapiro-Wilk normality test

data:  VAS[Incoord == 0]
W = 0.87506, p-value = 0.01444
with(AcousticData, shapiro.test(VAS[Incoord == 1]))

    Shapiro-Wilk normality test

data:  VAS[Incoord == 1]
W = 0.91494, p-value = 0.07923
## Equal Variance Check

res.ftest.VAS <- var.test(VAS ~ Incoord, data = AcousticData)
res.ftest.VAS

    F test to compare two variances

data:  VAS by Incoord
F = 1.0744, num df = 19, denom df = 19, p-value = 0.8774
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.4252539 2.7143765
sample estimates:
ratio of variances 
          1.074383 
# Model Results (Mann-Whitney U test conducted since assumption of normality is violated)

OT_MW <- wilcox.test(VAS ~ Incoord, data = AcousticData)
OT_MW

    Wilcoxon rank sum exact test

data:  VAS by Incoord
W = 207, p-value = 0.862
alternative hypothesis: true location shift is not equal to 0

OT Analysis

Since we found significant group differences for some acoustic measures between the ALS/PD and Ataxic/HD groups, we continued the heirarichal regression approach from OT Model 5. Adding in the Incoord predictor along with the interactions between the acoustic measures did not significantly improve model fit. So our original final OT model is retained.

Model 6


## Specifying Model 6

OT_Model6 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + Incoord, data = AcousticData)

## Model 6 Assumption Check

performance::check_model(OT_Model6)


## Model 6 Summary

summary(OT_Model6)

Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + 
    VSA_b + vowel_ED_b + Incoord, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-42.105 -11.266   4.121  13.717  31.536 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept)   17.5375    21.0257   0.834   0.4102  
Hull_bVSD_25  -1.6809     1.1892  -1.413   0.1669  
Hull_bVSD_75   0.9833     2.1390   0.460   0.6487  
Hull_b         1.0629     0.7946   1.338   0.1901  
VSA_b          6.5678     2.6475   2.481   0.0184 *
vowel_ED_b     4.8102    12.8358   0.375   0.7102  
Incoord1     -12.8123     7.6496  -1.675   0.1034  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 21.02 on 33 degrees of freedom
Multiple R-squared:  0.346, Adjusted R-squared:  0.2271 
F-statistic:  2.91 on 6 and 33 DF,  p-value: 0.02173
## Model 5 and Model 6 Comparison

anova(OT_Model5, OT_Model6)
Analysis of Variance Table

Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     34 15823                           
2     33 14583  1    1239.7 2.8053 0.1034

Model 7


## Specifying Model 7

OT_Model7 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25, data = AcousticData)

## Model 7 Assumption Check

performance::check_model(OT_Model7)


## Model 7 Summary

summary(OT_Model7)

Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + 
    VSA_b + vowel_ED_b + Incoord + Incoord * Hull_bVSD_25, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-41.665 -10.983   4.212  14.044  31.363 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)            19.3827    22.9018   0.846   0.4036  
Hull_bVSD_25           -1.7865     1.2973  -1.377   0.1780  
Hull_bVSD_75            0.8920     2.2093   0.404   0.6891  
Hull_b                  1.0871     0.8136   1.336   0.1909  
VSA_b                   6.5883     2.6881   2.451   0.0199 *
vowel_ED_b              4.3440    13.1935   0.329   0.7441  
Incoord1              -16.7140    19.2373  -0.869   0.3914  
Hull_bVSD_25:Incoord1   0.2417     1.0905   0.222   0.8260  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 21.33 on 32 degrees of freedom
Multiple R-squared:  0.347, Adjusted R-squared:  0.2042 
F-statistic: 2.429 on 7 and 32 DF,  p-value: 0.04086
## Model 6 and Model 7 Comparison

anova(OT_Model6, OT_Model7)
Analysis of Variance Table

Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     33 14583                           
2     32 14561  1    22.358 0.0491  0.826

Model 8


## Specifying Model 8

OT_Model8 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75, data = AcousticData)

## Model 8 Assumption Check

performance::check_model(OT_Model8)


## Model 8 Summary

summary(OT_Model8)

Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + 
    VSA_b + vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord * 
    Hull_bVSD_75, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-41.858 -12.366   6.261  13.135  30.401 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)            19.4909    22.7677   0.856   0.3985  
Hull_bVSD_25           -1.4002     1.3310  -1.052   0.3009  
Hull_bVSD_75           -0.7590     2.6079  -0.291   0.7730  
Hull_b                  0.9879     0.8132   1.215   0.2336  
VSA_b                   6.8700     2.6831   2.560   0.0155 *
vowel_ED_b              4.0042    13.1193   0.305   0.7622  
Incoord1               -6.3149    21.0758  -0.300   0.7665  
Hull_bVSD_25:Incoord1  -1.1508     1.6068  -0.716   0.4792  
Hull_bVSD_75:Incoord1   5.4156     4.6125   1.174   0.2493  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 21.21 on 31 degrees of freedom
Multiple R-squared:  0.3748,    Adjusted R-squared:  0.2135 
F-statistic: 2.323 on 8 and 31 DF,  p-value: 0.04412
## Model 7 and Model 8 Comparison

anova(OT_Model7, OT_Model8)
Analysis of Variance Table

Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     32 14561                           
2     31 13941  1    619.94 1.3786 0.2493

Model 9


## Specifying Model 9

OT_Model9 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b, data = AcousticData)

## Model 9 Assumption Check

performance::check_model(OT_Model9)


## Model 9 Summary

summary(OT_Model9)

Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + 
    VSA_b + vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord * 
    Hull_bVSD_75 + Incoord * Hull_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-43.387 -11.747   5.389  14.794  30.552 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)            22.2613    23.3541   0.953   0.3481  
Hull_bVSD_25           -0.8239     1.6003  -0.515   0.6104  
Hull_bVSD_75           -1.1104     2.6847  -0.414   0.6821  
Hull_b                  0.5095     1.0933   0.466   0.6446  
VSA_b                   6.9293     2.7092   2.558   0.0158 *
vowel_ED_b              5.4227    13.4118   0.404   0.6888  
Incoord1              -22.3892    32.2682  -0.694   0.4931  
Hull_bVSD_25:Incoord1  -2.4414     2.5348  -0.963   0.3432  
Hull_bVSD_75:Incoord1   6.0684     4.7580   1.275   0.2120  
Hull_b:Incoord1         1.1098     1.6753   0.662   0.5128  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 21.4 on 30 degrees of freedom
Multiple R-squared:  0.3838,    Adjusted R-squared:  0.199 
F-statistic: 2.076 on 9 and 30 DF,  p-value: 0.06468
## Model 8 and Model 9 Comparison

anova(OT_Model8, OT_Model9)
Analysis of Variance Table

Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75 + 
    Incoord * Hull_b
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     31 13941                           
2     30 13740  1    200.96 0.4388 0.5128

Model 10


## Specifying Model 10

OT_Model10 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b + Incoord*VSA_b, data = AcousticData)

## Model 10 Assumption Check

performance::check_model(OT_Model10)


## Model 10 Summary

summary(OT_Model10)

Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + 
    VSA_b + vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord * 
    Hull_bVSD_75 + Incoord * Hull_b + Incoord * VSA_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-43.360 -12.039   5.446  15.103  30.988 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)
(Intercept)            22.5101    23.8532   0.944    0.353
Hull_bVSD_25           -0.8290     1.6280  -0.509    0.614
Hull_bVSD_75           -1.1292     2.7353  -0.413    0.683
Hull_b                  0.4795     1.1439   0.419    0.678
VSA_b                   7.3071     4.3698   1.672    0.105
vowel_ED_b              5.0854    13.9703   0.364    0.718
Incoord1              -21.7310    33.3409  -0.652    0.520
Hull_bVSD_25:Incoord1  -2.3862     2.6248  -0.909    0.371
Hull_bVSD_75:Incoord1   6.0316     4.8495   1.244    0.224
Hull_b:Incoord1         1.1357     1.7194   0.660    0.514
VSA_b:Incoord1         -0.5224     4.6911  -0.111    0.912

Residual standard error: 21.76 on 29 degrees of freedom
Multiple R-squared:  0.3841,    Adjusted R-squared:  0.1717 
F-statistic: 1.809 on 10 and 29 DF,  p-value: 0.1038
## Model 9 and Model 10 Comparison

anova(OT_Model9, OT_Model10)
Analysis of Variance Table

Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75 + 
    Incoord * Hull_b
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75 + 
    Incoord * Hull_b + Incoord * VSA_b
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     30 13740                           
2     29 13734  1    5.8732 0.0124 0.9121

Model 11


## Specifying Model 11

OT_Model11 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b + Incoord*VSA_b + Incoord*vowel_ED_b, data = AcousticData)

## Model 11 Assumption Check

performance::check_model(OT_Model11)


## Model 11 Summary

summary(OT_Model11)

Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + 
    VSA_b + vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord * 
    Hull_bVSD_75 + Incoord * Hull_b + Incoord * VSA_b + Incoord * 
    vowel_ED_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-43.580  -9.987   5.535  12.978  34.285 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)            43.2053    29.3160   1.474   0.1517  
Hull_bVSD_25           -1.1058     1.6324  -0.677   0.5037  
Hull_bVSD_75           -1.5475     2.7375  -0.565   0.5764  
Hull_b                  0.7017     1.1505   0.610   0.5469  
VSA_b                  10.1342     4.9387   2.052   0.0496 *
vowel_ED_b            -11.6247    19.6753  -0.591   0.5594  
Incoord1              -65.5861    49.3675  -1.329   0.1947  
Hull_bVSD_25:Incoord1  -2.4987     2.6071  -0.958   0.3460  
Hull_bVSD_75:Incoord1   7.0129     4.8830   1.436   0.1620  
Hull_b:Incoord1         0.9481     1.7139   0.553   0.5845  
VSA_b:Incoord1         -4.9394     5.9410  -0.831   0.4128  
vowel_ED_b:Incoord1    33.2037    27.7349   1.197   0.2413  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 21.6 on 28 degrees of freedom
Multiple R-squared:  0.4141,    Adjusted R-squared:  0.1839 
F-statistic: 1.799 on 11 and 28 DF,  p-value: 0.1025
## Model 10 and Model 11 Comparison

anova(OT_Model10, OT_Model11)
Analysis of Variance Table

Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75 + 
    Incoord * Hull_b + Incoord * VSA_b
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75 + 
    Incoord * Hull_b + Incoord * VSA_b + Incoord * vowel_ED_b
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     29 13734                           
2     28 13065  1    668.77 1.4332 0.2413

VAS Analysis

Since we found significant group differences for some acoustic measures between the ALS/PD and Ataxic/HD groups, we continued the hierarchical regression approach from VAS Model 5. VAS Model 6 fit significantly better than VAS Model 5. However, adding in the interactions between Incoord and the acoustic measures did not significantly improve model fit.

Model 6


## Specifying Model 6

VAS_Model6 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + Incoord, data = AcousticData)

## Model 6 Assumption Check

performance::check_model(VAS_Model6)


## Model 6 Summary

summary(VAS_Model6)

Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + 
    vowel_ED_b + Incoord, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-41.188 -13.751   2.167  16.256  36.926 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept)    8.6850    22.7911   0.381   0.7056  
Hull_bVSD_25  -2.1615     1.2891  -1.677   0.1030  
Hull_bVSD_75   1.7100     2.3186   0.738   0.4660  
Hull_b         1.2359     0.8613   1.435   0.1607  
VSA_b          7.4668     2.8698   2.602   0.0138 *
vowel_ED_b     5.5718    13.9135   0.400   0.6914  
Incoord1     -17.9628     8.2919  -2.166   0.0376 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 22.79 on 33 degrees of freedom
Multiple R-squared:  0.3632,    Adjusted R-squared:  0.2474 
F-statistic: 3.137 on 6 and 33 DF,  p-value: 0.0152
## Model 5 and Model 6 Comparison

anova(VAS_Model5, VAS_Model6)
Analysis of Variance Table

Model 1: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b
Model 2: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord
  Res.Df   RSS Df Sum of Sq      F  Pr(>F)  
1     34 19572                              
2     33 17135  1    2436.7 4.6929 0.03761 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model 7


## Specifying Model 7

VAS_Model7 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25, data = AcousticData)

## Model 7 Assumption Check

performance::check_model(VAS_Model7)


## Model 7 Summary

summary(VAS_Model7)

Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + 
    vowel_ED_b + Incoord + Incoord * Hull_bVSD_25, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-42.039 -14.972   3.129  15.900  35.174 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)            13.6424    24.7265   0.552   0.5850  
Hull_bVSD_25           -2.4451     1.4006  -1.746   0.0905 .
Hull_bVSD_75            1.4646     2.3853   0.614   0.5435  
Hull_b                  1.3009     0.8784   1.481   0.1484  
VSA_b                   7.5218     2.9023   2.592   0.0143 *
vowel_ED_b              4.3193    14.2447   0.303   0.7637  
Incoord1              -28.4451    20.7701  -1.370   0.1804  
Hull_bVSD_25:Incoord1   0.6494     1.1773   0.552   0.5851  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 23.03 on 32 degrees of freedom
Multiple R-squared:  0.3692,    Adjusted R-squared:  0.2312 
F-statistic: 2.675 on 7 and 32 DF,  p-value: 0.02675
## Model 6 and Model 7 Comparison

anova(VAS_Model6, VAS_Model7)
Analysis of Variance Table

Model 1: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord
Model 2: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     33 17135                           
2     32 16973  1    161.37 0.3042 0.5851

Model 8


## Specifying Model 8

VAS_Model8 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75, data = AcousticData)

## Model 8 Assumption Check

performance::check_model(VAS_Model8)


## Model 8 Summary

summary(VAS_Model8)

Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + 
    vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord * 
    Hull_bVSD_75, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-42.267 -15.867   1.797  15.875  35.281 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)            13.7131    24.9259   0.550   0.5862  
Hull_bVSD_25           -2.1928     1.4571  -1.505   0.1425  
Hull_bVSD_75            0.3863     2.8551   0.135   0.8932  
Hull_b                  1.2361     0.8903   1.388   0.1749  
VSA_b                   7.7058     2.9374   2.623   0.0134 *
vowel_ED_b              4.0973    14.3629   0.285   0.7773  
Incoord1              -21.6529    23.0737  -0.938   0.3553  
Hull_bVSD_25:Incoord1  -0.2601     1.7591  -0.148   0.8834  
Hull_bVSD_75:Incoord1   3.5372     5.0497   0.700   0.4889  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 23.22 on 31 degrees of freedom
Multiple R-squared:  0.379, Adjusted R-squared:  0.2188 
F-statistic: 2.365 on 8 and 31 DF,  p-value: 0.04086
## Model 7 and Model 8 Comparison

anova(VAS_Model7, VAS_Model8)
Analysis of Variance Table

Model 1: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25
Model 2: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     32 16973                           
2     31 16709  1    264.47 0.4907 0.4889

Model 9


## Specifying Model 9

VAS_Model9 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b, data = AcousticData)

## Model 9 Assumption Check

performance::check_model(VAS_Model9)


## Model 9 Summary

summary(VAS_Model9)

Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + 
    vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord * 
    Hull_bVSD_75 + Incoord * Hull_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-41.224 -14.209   4.443  15.797  35.400 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)            15.9000    25.6576   0.620   0.5401  
Hull_bVSD_25           -1.7379     1.7582  -0.988   0.3308  
Hull_bVSD_75            0.1089     2.9495   0.037   0.9708  
Hull_b                  0.8585     1.2011   0.715   0.4803  
VSA_b                   7.7527     2.9764   2.605   0.0142 *
vowel_ED_b              5.2170    14.7346   0.354   0.7258  
Incoord1              -34.3418    35.4508  -0.969   0.3404  
Hull_bVSD_25:Incoord1  -1.2789     2.7848  -0.459   0.6494  
Hull_bVSD_75:Incoord1   4.0525     5.2273   0.775   0.4443  
Hull_b:Incoord1         0.8760     1.8406   0.476   0.6376  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 23.51 on 30 degrees of freedom
Multiple R-squared:  0.3837,    Adjusted R-squared:  0.1988 
F-statistic: 2.075 on 9 and 30 DF,  p-value: 0.06485
## Model 8 and Model 9 Comparison

anova(VAS_Model8, VAS_Model9)
Analysis of Variance Table

Model 1: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75
Model 2: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75 + 
    Incoord * Hull_b
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     31 16709                           
2     30 16584  1    125.23 0.2265 0.6376

Model 10


## Specifying Model 10

VAS_Model10 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b + Incoord*VSA_b, data = AcousticData)

## Model 10 Assumption Check

performance::check_model(VAS_Model10)


## Model 10 Summary

summary(VAS_Model10)

Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + 
    vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord * 
    Hull_bVSD_75 + Incoord * Hull_b + Incoord * VSA_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-41.129 -14.693   2.991  15.841  36.960 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)  
(Intercept)            16.79076   26.15188   0.642   0.5259  
Hull_bVSD_25           -1.75601    1.78484  -0.984   0.3333  
Hull_bVSD_75            0.04151    2.99886   0.014   0.9891  
Hull_b                  0.75103    1.25414   0.599   0.5539  
VSA_b                   9.10491    4.79089   1.900   0.0674 .
vowel_ED_b              4.00968   15.31664   0.262   0.7953  
Incoord1              -31.98544   36.55389  -0.875   0.3888  
Hull_bVSD_25:Incoord1  -1.08148    2.87770  -0.376   0.7098  
Hull_bVSD_75:Incoord1   3.92085    5.31689   0.737   0.4668  
Hull_b:Incoord1         0.96884    1.88513   0.514   0.6112  
VSA_b:Incoord1         -1.87019    5.14318  -0.364   0.7188  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 23.86 on 29 degrees of freedom
Multiple R-squared:  0.3865,    Adjusted R-squared:  0.1749 
F-statistic: 1.827 on 10 and 29 DF,  p-value: 0.1001
## Model 9 and Model 10 Comparison

anova(VAS_Model9, VAS_Model10)
Analysis of Variance Table

Model 1: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75 + 
    Incoord * Hull_b
Model 2: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75 + 
    Incoord * Hull_b + Incoord * VSA_b
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     30 16584                           
2     29 16508  1    75.269 0.1322 0.7188

Model 11


## Specifying Model 11

VAS_Model11 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b + Incoord*VSA_b + Incoord*vowel_ED_b, data = AcousticData)

## Model 11 Assumption Check

performance::check_model(VAS_Model11)


## Model 11 Summary

summary(VAS_Model11)

Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + 
    vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord * 
    Hull_bVSD_75 + Incoord * Hull_b + Incoord * VSA_b + Incoord * 
    vowel_ED_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-40.891 -10.110   1.062  12.791  41.858 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)            47.5360    31.4458   1.512   0.1418  
Hull_bVSD_25           -2.1672     1.7510  -1.238   0.2261  
Hull_bVSD_75           -0.5799     2.9363  -0.198   0.8449  
Hull_b                  1.0811     1.2341   0.876   0.3885  
VSA_b                  13.3050     5.2975   2.512   0.0181 *
vowel_ED_b            -20.8152    21.1048  -0.986   0.3324  
Incoord1              -97.1376    52.9541  -1.834   0.0772 .
Hull_bVSD_25:Incoord1  -1.2486     2.7965  -0.447   0.6587  
Hull_bVSD_75:Incoord1   5.3787     5.2378   1.027   0.3133  
Hull_b:Incoord1         0.6902     1.8384   0.375   0.7102  
VSA_b:Incoord1         -8.4322     6.3726  -1.323   0.1965  
vowel_ED_b:Incoord1    49.3281    29.7498   1.658   0.1085  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 23.17 on 28 degrees of freedom
Multiple R-squared:  0.4413,    Adjusted R-squared:  0.2218 
F-statistic: 2.011 on 11 and 28 DF,  p-value: 0.06657
## Model 10 and Model 11 Comparison

anova(VAS_Model10, VAS_Model11)
Analysis of Variance Table

Model 1: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75 + 
    Incoord * Hull_b + Incoord * VSA_b
Model 2: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75 + 
    Incoord * Hull_b + Incoord * VSA_b + Incoord * vowel_ED_b
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     29 16508                           
2     28 15032  1      1476 2.7493 0.1085

New Final VAS Model

Since VAS Model 6 was significantly better fit than Model 5, we fit a new final parsimonious model for VAS to the data (VAS ~ VSA_b + Incoord) and compared that to the old final VAS model (VAS ~ VSA_b). The new final model was not a significantly better fit than the old final model. Thus the old final model (VAS ~ VSA_b) is retained.


## Specifying New Final VAS Model

VAS_Model_newfinal <- lm(VAS ~ VSA_b + Incoord, data = AcousticData)

## New Final VAS Model Assumption Check

performance::check_model(VAS_Model_newfinal)


## New Final VAS Model Summary

summary(VAS_Model_newfinal)

Call:
lm(formula = VAS ~ VSA_b + Incoord, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-42.770 -17.018   3.197  18.896  40.044 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   25.305      8.498   2.978 0.005097 ** 
VSA_b          7.680      1.925   3.990 0.000301 ***
Incoord1     -14.624      7.873  -1.858 0.071190 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 22.54 on 37 degrees of freedom
Multiple R-squared:  0.3012,    Adjusted R-squared:  0.2635 
F-statistic: 7.975 on 2 and 37 DF,  p-value: 0.001319
## Comparison to Old Final Model

anova(VAS_Model_final, VAS_Model_newfinal)
Analysis of Variance Table

Model 1: VAS ~ VSA_b
Model 2: VAS ~ VSA_b + Incoord
  Res.Df   RSS Df Sum of Sq      F  Pr(>F)  
1     38 20556                              
2     37 18802  1    1753.6 3.4509 0.07119 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Testing Individual Predictors

Because some correlations between predictors are high. We run a series of simple linear regressions to test if the predictors significantly predict each intelligibility measure on their own (VSD 25 and VSA models were already complete in our initial model comparison approach)

Orthographic Transcription Models


# OT ~ VSD 75

OT_vsd75_model <- lm(transAcc ~ Hull_bVSD_75, data = AcousticData)
performance::check_model(OT_vsd75_model)

summary(OT_vsd75_model)

Call:
lm(formula = transAcc ~ Hull_bVSD_75, data = AcousticData)

Residuals:
   Min     1Q Median     3Q    Max 
-47.60 -16.32   6.10  16.13  31.96 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)   56.4278     5.4314  10.389 1.17e-12 ***
Hull_bVSD_75   0.9052     1.7124   0.529      0.6    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 24.14 on 38 degrees of freedom
Multiple R-squared:  0.0073,    Adjusted R-squared:  -0.01882 
F-statistic: 0.2794 on 1 and 38 DF,  p-value: 0.6001
# OT ~ Hull

OT_hull_model <- lm(transAcc ~ Hull_b, data = AcousticData)
performance::check_model(OT_hull_model)

summary(OT_hull_model)

Call:
lm(formula = transAcc ~ Hull_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-53.141 -12.306   4.848  18.324  31.854 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)  34.0817    13.5989   2.506   0.0166 *
Hull_b        0.7879     0.4231   1.862   0.0703 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 23.19 on 38 degrees of freedom
Multiple R-squared:  0.08365,   Adjusted R-squared:  0.05953 
F-statistic: 3.469 on 1 and 38 DF,  p-value: 0.07029
# OT ~ Corner Dispersion

OT_disp_model <- lm(transAcc ~ vowel_ED_b, data = AcousticData)
performance::check_model(OT_disp_model)

summary(OT_disp_model)

Call:
lm(formula = transAcc ~ vowel_ED_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-53.949 -10.348   4.268  14.982  25.903 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept)    6.227     18.611   0.335  0.73977   
vowel_ED_b    25.564      8.946   2.857  0.00689 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 21.98 on 38 degrees of freedom
Multiple R-squared:  0.1769,    Adjusted R-squared:  0.1552 
F-statistic: 8.165 on 1 and 38 DF,  p-value: 0.006891

VAS Models


# VAS ~ VSD 75

VAS_vsd75_model <- lm(VAS ~ Hull_bVSD_75, data = AcousticData)
performance::check_model(VAS_vsd75_model)

summary(VAS_vsd75_model)

Call:
lm(formula = VAS ~ Hull_bVSD_75, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-47.036 -18.277   9.543  21.192  37.312 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)    49.543      5.963   8.308 4.51e-10 ***
Hull_bVSD_75    1.067      1.880   0.567    0.574    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 26.5 on 38 degrees of freedom
Multiple R-squared:  0.0084,    Adjusted R-squared:  -0.01769 
F-statistic: 0.3219 on 1 and 38 DF,  p-value: 0.5738
# VAS ~ Hull

VAS_hull_model <- lm(VAS ~ Hull_b, data = AcousticData)
performance::check_model(VAS_hull_model)

summary(VAS_hull_model)

Call:
lm(formula = VAS ~ Hull_b, data = AcousticData)

Residuals:
   Min     1Q Median     3Q    Max 
-52.65 -19.68   7.88  21.88  33.56 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)  28.3768    15.0913   1.880   0.0677 .
Hull_b        0.7616     0.4695   1.622   0.1130  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 25.73 on 38 degrees of freedom
Multiple R-squared:  0.06476,   Adjusted R-squared:  0.04015 
F-statistic: 2.631 on 1 and 38 DF,  p-value: 0.113
# VAS ~ Corner Dispersion

VAS_disp_model <- lm(VAS ~ vowel_ED_b, data = AcousticData)
performance::check_model(VAS_disp_model)

summary(VAS_disp_model)

Call:
lm(formula = VAS ~ vowel_ED_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-52.146 -13.413   7.142  18.719  32.964 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)   -2.859     20.636  -0.139   0.8905  
vowel_ED_b    26.819      9.920   2.704   0.0102 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 24.37 on 38 degrees of freedom
Multiple R-squared:  0.1613,    Adjusted R-squared:  0.1393 
F-statistic:  7.31 on 1 and 38 DF,  p-value: 0.0102

Listener Demographic Information


ListenerDemo <- Listeners %>%
  furniture::table1(age, gender, race, ethnicity)
ListenerDemo

──────────────────────────────────────────────
──────────────────────────────────────────────

Speaker Demographics


SpeakerDemo <- AcousticData %>%
  dplyr::select(c(Speaker, Sex, Etiology))

Ages <- rio::import("Prepped Data/Speaker Ages.xlsx")

SpeakerDemo <- full_join(SpeakerDemo, Ages, by = "Speaker")

SpeakerDemoInfo <- SpeakerDemo %>%
  furniture::table1(Sex, Etiology, Age, na.rm = F)
SpeakerDemoInfo

─────────────────────────────
─────────────────────────────
SpeakerDemo %>%
  dplyr::summarize(mean_age = mean(Age, na.rm = T), age_sd = sd(Age, na.rm = T), age_range = range(Age, na.rm = T))
NA
LS0tCnRpdGxlOiAiTW90b3IgU3BlZWNoIENvbmZlcmVuY2UiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClRoaXMgaXMgdGhlIGNvZGUgZm9yIHRoZSBzdGF0aXN0aWNhbCBhbmFseXNpcyBmb3IgTW90b3IgU3BlZWNoIENvbmZlcmVuY2UgMjAyMi4KCiMgTG9hZGluZyBQYWNrYWdlcwoKYGBge3J9CgpsaWJyYXJ5KHJpbykKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoaXJyKQpsaWJyYXJ5KHBlcmZvcm1hbmNlKQpsaWJyYXJ5KGNhcikKbGlicmFyeShnZ3B1YnIpCmxpYnJhcnkoY29ycnIpCmxpYnJhcnkoZ2dyaWRnZXMpCmxpYnJhcnkoZnVybml0dXJlKQoKYGBgCgojIFVwbG9hZCBEYXRhc2V0cwoKYGBge3J9CgpSZWxpYWJpbGl0eSA8LSByaW86OmltcG9ydCgiUHJlcHBlZCBEYXRhL1JlbGlhYmlsaXR5IERhdGEuY3N2IikKQWNvdXN0aWNEYXRhIDwtIHJpbzo6aW1wb3J0KCJQcmVwcGVkIERhdGEvQWNvdXN0aWNNZWFzdXJlcy5jc3YiKSAKCkFjb3VzdGljRGF0YSA8LSBBY291c3RpY0RhdGEgJT4lCiAgZHBseXI6OmZpbHRlcighZ3JlcGwoIl9yZWwiLCBTcGVha2VyKSkgJT4lCiAgZHBseXI6OnNlbGVjdChjKFNwZWFrZXIsIFNleCwgRXRpb2xvZ3ksIHZvd2VsX0VEX2IsIFZTQV9iLCBIdWxsX2IsIEh1bGxfYlZTRF8yNSwgSHVsbF9iVlNEXzUwLCBIdWxsX2JWU0RfNzUsIFZBUywgdHJhbnNBY2MpKQoKTGlzdGVuZXJzIDwtIHJpbzo6aW1wb3J0KCJQcmVwcGVkIERhdGEvTGlzdGVuZXJfRGVtb2dyYXBoaWNzLmNzdiIpICU+JQogIGRwbHlyOjpzZWxlY3QoIWMoU3RhcnREYXRlOnByb2xvZmljSUQsIFEyLjRfNl9URVhULCBRMy4yXzhfVEVYVCwgQXVkaW9DaGVjazpFUDMpKQoKTGlzdGVuZXJzJHJhY2VbTGlzdGVuZXJzJFEzLjNfN19URVhUID09ICJOYXRpdmUgQW1lcmljYW4vIEFmcmljYW4gYW1lcmNpbmciXSA8LSAiQmlyYWNpYWwgb3IgTXVsdGlyYWNpYWwiCmBgYAoKCiMgSW50ZXItcmF0ZXIgUmVsaWFiaWxpdHkKClR3byByYXRlcnMgKHRoZSBmaXJzdCB0d28gYXV0aG9ycykgY29tcGxldGVkIHZvd2VsIHNlZ21lbnRhdGlvbiBmb3IgdGhlIHNwZWFrZXJzLiBUbyBjYWxjdWxhdGUgaW50ZXItcmF0ZXIgcmVsaWFiaWxpdHksIDIwJSBvZiB0aGUgc3BlYWtlcnMgd2VyZSBzZWdtZW50ZWQgYWdhaW4gYnkgdGhlIG90aGVyIHJhdGVyLiBUd28td2F5IGludHJhY2xhc3MgY29lZmZpY2llbnRzIHdlcmUgY29tcHV0ZWQgZm9yIHRoZSBleHRyYWN0ZWQgRjEgYW5kIEYyIGZyb20gdGhlIHRlbXBvcmFsIG1pZHBvaW50IG9mIHRoZSB2b3dlbCBzZWdtZW50cy4gU2luY2Ugb25seSBvbmUgc2V0IG9mIHJhdGluZ3Mgd2lsbCBiZSB1c2VkIGluIHRoZSBkYXRhIGFuYWx5c2lzLCB3ZSBmb2N1cyBvbiB0aGUgc2luZ2xlIElDQyByZXN1bHRzIGFuZCBpbnRlcnByZXRhdGlvbi4gSG93ZXZlciwgd2UgYWxzbyByZXBvcnQgdGhlIGF2ZXJhZ2UgSUNDIHZhbHVlcyB0byBiZSBjb21wcmVoZW5zaXZlLgoKYGBge3J9CgojIyBDcmVhdGluZyBuZXcgZGF0YSBmcmFtZXMgdG8gY2FsY3VsYXRlIElDQyBmb3IgZXh0cmFjdGVkIEYxIGFuZCBGMiB2YWx1ZXMKCkYxX1JlbCA8LSBSZWxpYWJpbGl0eSAlPiUKICBkcGx5cjo6c2VsZWN0KGMoRjEsIEYxX3JlbCkpCgpGMl9SZWwgPC0gUmVsaWFiaWxpdHkgJT4lCiAgZHBseXI6OnNlbGVjdChjKEYyLCBGMl9yZWwpKQogIAojIyBTaW5nbGUgSUNDIGZvciBGMQpTaW5nbGVfRjEgPC0gaXJyOjppY2MoRjFfUmVsLCBtb2RlbCA9ICJ0d293YXkiLCB0eXBlID0gImFncmVlbWVudCIsIHVuaXQgPSAic2luZ2xlIikKCiMjIEF2ZXJhZ2UgSUNDIGZvciBGMQpBdmVyYWdlX0YxIDwtIGlycjo6aWNjKEYxX1JlbCwgbW9kZWwgPSAidHdvd2F5IiwgdHlwZSA9ICJhZ3JlZW1lbnQiLCB1bml0ID0gImF2ZXJhZ2UiKQoKIyMgU2luZ2xlIElDQyBmb3IgRjIKU2luZ2xlX0YyIDwtIGlycjo6aWNjKEYyX1JlbCwgbW9kZWwgPSAidHdvd2F5IiwgdHlwZSA9ICJhZ3JlZW1lbnQiLCB1bml0ID0gInNpbmdsZSIpCgojIyBBdmVyYWdlIElDQyBmb3IgRjIKQXZlcmFnZV9GMiA8LSBpcnI6OmljYyhGMl9SZWwsIG1vZGVsID0gInR3b3dheSIsIHR5cGUgPSAiYWdyZWVtZW50IiwgdW5pdCA9ICJhdmVyYWdlIikKCiMjIEludGVyLXJhdGVyIHJlbGlhYmlsaXR5IHJlc3VsdHMgYW5kIGludGVycHJldGF0aW9uCgpwcmludChwYXN0ZSgiU2luZ2xlIElDQyBmb3IgRjEgaXMgIiwgcm91bmQoU2luZ2xlX0YxJHZhbHVlLCBkaWdpdHMgPSAzKSwgIi4gIiwgCiAgICAgICAgICAgICJUaGUgOTUlIENJIGlzIFsiLCByb3VuZChTaW5nbGVfRjEkbGJvdW5kLCBkaWdpdHMgPSAzKSwgIiAtICIsIHJvdW5kKFNpbmdsZV9GMSR1Ym91bmQsIGRpZ2l0cyA9IDMpLCAiXS4iLCBzZXAgPSAiIikpCgpwcmludChwYXN0ZSgiU2luZ2xlIElDQyBmb3IgRjIgaXMgIiwgcm91bmQoU2luZ2xlX0YyJHZhbHVlLCBkaWdpdHMgPSAzKSwgIi4gIiwgCiAgICAgICAgICAgICJUaGUgOTUlIENJIGlzIFsiLCByb3VuZChTaW5nbGVfRjIkbGJvdW5kLCBkaWdpdHMgPSAzKSwgIiAtICIsIHJvdW5kKFNpbmdsZV9GMiR1Ym91bmQsIGRpZ2l0cyA9IDMpLCAiXS4iLCBzZXAgPSAiIikpCgpwcmludChwYXN0ZSgiQXZlcmFnZSBJQ0MgZm9yIEYxIGlzICIsIHJvdW5kKEF2ZXJhZ2VfRjEkdmFsdWUsIGRpZ2l0cyA9IDMpLCAiLiAiLCAKICAgICAgICAgICAgIlRoZSA5NSUgQ0kgaXMgWyIsIHJvdW5kKEF2ZXJhZ2VfRjEkbGJvdW5kLCBkaWdpdHMgPSAzKSwgIiAtICIsIHJvdW5kKEF2ZXJhZ2VfRjEkdWJvdW5kLCBkaWdpdHMgPSAzKSwgIl0uIiwgc2VwID0gIiIpKQoKcHJpbnQocGFzdGUoIkF2ZXJhZ2UgSUNDIGZvciBGMiBpcyAiLCByb3VuZChBdmVyYWdlX0YyJHZhbHVlLCBkaWdpdHMgPSAzKSwgIi4gIiwgCiAgICAgICAgICAgICJUaGUgOTUlIENJIGlzIFsiLCByb3VuZChBdmVyYWdlX0YyJGxib3VuZCwgZGlnaXRzID0gMyksICIgLSAiLCByb3VuZChBdmVyYWdlX0YyJHVib3VuZCwgZGlnaXRzID0gMyksICJdLiIsIHNlcCA9ICIiKSkKCnByaW50KCJUaHVzLCBpbnRlcnJhdGVyIHJlbGlhYmlsaXR5IGZvciB0aGUgZXh0cmFjdGVkIEYxIGFuZCBGMiB2YWx1ZXMgZnJvbSB0aGUgdm93ZWwgc2VnbWVudHMgd2FzIGdvb2QgdG8gZXhjZWxsZW50LiIpCgojIyBSZW1vdmluZyBleHRyYSBkYXRhIGZyYW1lcyBmcm9tIGVudmlyb25tZW50CgpybShGMV9SZWwsIEYyX1JlbCwgUmVsaWFiaWxpdHksIFNpbmdsZV9GMSwgU2luZ2xlX0YyLCBBdmVyYWdlX0YxLCBBdmVyYWdlX0YyKQoKYGBgCgoKIyBEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzCgojIyBNZWFucyBhbmQgU0QKCmBgYHtyfQoKRGVzY3JpcHRpdmVzIDwtIEFjb3VzdGljRGF0YSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoU2V4LCBFdGlvbG9neSkgJT4lCiAgZHBseXI6OnN1bW1hcml6ZShWU0FfbWVhbiA9IG1lYW4oVlNBX2IsIG5hLnJtID1UKSwgVlNBX3NkID0gc2QoVlNBX2IsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgICBEaXNwX21lYW4gPSBtZWFuKHZvd2VsX0VEX2IsIG5hLnJtID1UKSwgRGlzcF9zZCA9IHNkKHZvd2VsX0VEX2IsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIEh1bGxfbWVhbiA9IG1lYW4oSHVsbF9iLCBuYS5ybSA9VCksIEh1bGxfc2QgPSBzZChIdWxsX2IsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZTRDI1X21lYW4gPSBtZWFuKEh1bGxfYlZTRF8yNSwgbmEucm0gPVQpLCBWU0QyNV9zZCA9IHNkKEh1bGxfYlZTRF8yNSwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVlNENTBfbWVhbiA9IG1lYW4oSHVsbF9iVlNEXzUwLCBuYS5ybSA9VCksIFZTRDUwX3NkID0gc2QoSHVsbF9iVlNEXzUwLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWU0Q3NV9tZWFuID0gbWVhbihIdWxsX2JWU0RfNzUsIG5hLnJtID1UKSwgVlNENzVfc2QgPSBzZChIdWxsX2JWU0RfNzUsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZBU19tZWFuID0gbWVhbihWQVMsIG5hLnJtID1UKSwgVkFTX3NkID0gc2QoVkFTLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBPVF9tZWFuID0gbWVhbih0cmFuc0FjYywgbmEucm0gPVQpLCBPVF9zZCA9IHNkKHRyYW5zQWNjLCBuYS5ybSA9VCkpCgpEZXNjcmlwdGl2ZXNieVNleCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZHBseXI6Omdyb3VwX2J5KFNleCkgJT4lCiAgZHBseXI6OnN1bW1hcml6ZShWU0FfbWVhbiA9IG1lYW4oVlNBX2IsIG5hLnJtID1UKSwgVlNBX3NkID0gc2QoVlNBX2IsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgICBEaXNwX21lYW4gPSBtZWFuKHZvd2VsX0VEX2IsIG5hLnJtID1UKSwgRGlzcF9zZCA9IHNkKHZvd2VsX0VEX2IsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIEh1bGxfbWVhbiA9IG1lYW4oSHVsbF9iLCBuYS5ybSA9VCksIEh1bGxfc2QgPSBzZChIdWxsX2IsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZTRDI1X21lYW4gPSBtZWFuKEh1bGxfYlZTRF8yNSwgbmEucm0gPVQpLCBWU0QyNV9zZCA9IHNkKEh1bGxfYlZTRF8yNSwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVlNENTBfbWVhbiA9IG1lYW4oSHVsbF9iVlNEXzUwLCBuYS5ybSA9VCksIFZTRDUwX3NkID0gc2QoSHVsbF9iVlNEXzUwLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWU0Q3NV9tZWFuID0gbWVhbihIdWxsX2JWU0RfNzUsIG5hLnJtID1UKSwgVlNENzVfc2QgPSBzZChIdWxsX2JWU0RfNzUsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZBU19tZWFuID0gbWVhbihWQVMsIG5hLnJtID1UKSwgVkFTX3NkID0gc2QoVkFTLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBPVF9tZWFuID0gbWVhbih0cmFuc0FjYywgbmEucm0gPVQpLCBPVF9zZCA9IHNkKHRyYW5zQWNjLCBuYS5ybSA9VCkpCgpEZXNjcmlwdGl2ZXNieUV0aW9sb2d5IDwtIEFjb3VzdGljRGF0YSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoRXRpb2xvZ3kpICU+JQogIGRwbHlyOjpzdW1tYXJpemUoVlNBX21lYW4gPSBtZWFuKFZTQV9iLCBuYS5ybSA9VCksIFZTQV9zZCA9IHNkKFZTQV9iLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgICAgRGlzcF9tZWFuID0gbWVhbih2b3dlbF9FRF9iLCBuYS5ybSA9VCksIERpc3Bfc2QgPSBzZCh2b3dlbF9FRF9iLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBIdWxsX21lYW4gPSBtZWFuKEh1bGxfYiwgbmEucm0gPVQpLCBIdWxsX3NkID0gc2QoSHVsbF9iLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWU0QyNV9tZWFuID0gbWVhbihIdWxsX2JWU0RfMjUsIG5hLnJtID1UKSwgVlNEMjVfc2QgPSBzZChIdWxsX2JWU0RfMjUsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZTRDUwX21lYW4gPSBtZWFuKEh1bGxfYlZTRF81MCwgbmEucm0gPVQpLCBWU0Q1MF9zZCA9IHNkKEh1bGxfYlZTRF81MCwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVlNENzVfbWVhbiA9IG1lYW4oSHVsbF9iVlNEXzc1LCBuYS5ybSA9VCksIFZTRDc1X3NkID0gc2QoSHVsbF9iVlNEXzc1LCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWQVNfbWVhbiA9IG1lYW4oVkFTLCBuYS5ybSA9VCksIFZBU19zZCA9IHNkKFZBUywgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgT1RfbWVhbiA9IG1lYW4odHJhbnNBY2MsIG5hLnJtID1UKSwgT1Rfc2QgPSBzZCh0cmFuc0FjYywgbmEucm0gPVQpKQoKRGVzY3JpcHRpdmVzCgpEZXNjcmlwdGl2ZXNieVNleAoKRGVzY3JpcHRpdmVzYnlFdGlvbG9neQoKYGBgCgojIyBDb3JyZWxhdGlvbnMgYW1vbmcgdmFyaWFibGVzCgpgYGB7cn0KCkNvcnJNYXRyaXgxIDwtIEFjb3VzdGljRGF0YSAlPiUKICBkcGx5cjo6c2VsZWN0KFZTQV9iLCB2b3dlbF9FRF9iLCBIdWxsX2IsIEh1bGxfYlZTRF8yNSwgSHVsbF9iVlNEXzUwLCBIdWxsX2JWU0RfNzUsIFZBUywgdHJhbnNBY2MpICU+JQogIGNvcnJyOjpjb3JyZWxhdGUoKQoKQ29yck1hdHJpeDEKCmBgYAoKCiMjIERhdGEgVmlzCgojIyMgR3JvdXAgQ29tcGFyaXNvbnM6IFJpZGdlbGluZSBQbG90cwoKYGBge3J9CgojIFZvd2VsIFNwYWNlIEFyZWEgRGlzdHJpYnV0aW9uIGJ5IEV0aW9sb2d5CgpWU0FfcGxvdCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gVlNBX2IsCiAgICAgIHkgPSBFdGlvbG9neSwKICAgICAgY29sb3IgPSBFdGlvbG9neSwKICAgICAgZmlsbCA9IEV0aW9sb2d5KSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhqaXR0ZXJlZF9wb2ludHMgPSBULCAKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcih3aWR0aCA9IDAuMDEsIGhlaWdodCA9IDApLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NoYXBlID0gJ3wnLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSA1LAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAxLAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjcsCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IC43KSArCiAgeGxhYigiVm93ZWwgU3BhY2UgQXJlYSAoQmFyaykiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIyBDb3JuZXIgRGlzcGVyc2lvbiBEaXN0cmlidXRpb24gYnkgRXRpb2xvZ3kKCmRpc3BfcGxvdCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gdm93ZWxfRURfYiwKICAgICAgeSA9IEV0aW9sb2d5LAogICAgICBjb2xvciA9IEV0aW9sb2d5LAogICAgICBmaWxsID0gRXRpb2xvZ3kpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGppdHRlcmVkX3BvaW50cyA9IFQsIAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKHdpZHRoID0gMC4wMSwgaGVpZ2h0ID0gMCksIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2hhcGUgPSAnfCcsIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDUsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNywKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gLjcpICsKICB4bGFiKCJDb3JuZXIgRGlzcGVyc2lvbiAoQmFyaykiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIFZvd2VsIFNwYWNlIEh1bGwgRGlzdHJpYnV0aW9uIGJ5IEV0aW9sb2d5CgpIdWxsX3Bsb3QgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IEh1bGxfYiwKICAgICAgeSA9IEV0aW9sb2d5LAogICAgICBjb2xvciA9IEV0aW9sb2d5LAogICAgICBmaWxsID0gRXRpb2xvZ3kpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGppdHRlcmVkX3BvaW50cyA9IFQsIAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKHdpZHRoID0gMC4wMSwgaGVpZ2h0ID0gMCksIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2hhcGUgPSAnfCcsIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDUsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNywKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gLjcpICsKICB4bGFiKCJWb3dlbCBTcGFjZSBIdWxsIChCYXJrKSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgVm93ZWwgU3BhY2UgRGVuc2l0eSAyNSBEaXN0cmlidXRpb24gYnkgRXRpb2xvZ3kKCnZzZF8yNV9wbG90IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfMjUsCiAgICAgIHkgPSBFdGlvbG9neSwKICAgICAgY29sb3IgPSBFdGlvbG9neSwKICAgICAgZmlsbCA9IEV0aW9sb2d5KSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhqaXR0ZXJlZF9wb2ludHMgPSBULCAKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcih3aWR0aCA9IDAuMDEsIGhlaWdodCA9IDApLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NoYXBlID0gJ3wnLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSA1LAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAxLAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjcsCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IC43KSArCiAgeGxhYigiVm93ZWwgU3BhY2UgRGVuaXN0eSAyNSAoQmFyaykiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIFZvd2VsIFNwYWNlIERlbnNpdHkgNTAgRGlzdHJpYnV0aW9uIGJ5IEV0aW9sb2d5Cgp2c2RfNTBfcGxvdCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iVlNEXzUwLAogICAgICB5ID0gRXRpb2xvZ3ksCiAgICAgIGNvbG9yID0gRXRpb2xvZ3ksCiAgICAgIGZpbGwgPSBFdGlvbG9neSkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIlZvd2VsIFNwYWNlIERlbmlzdHkgNTAgKEJhcmspIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyBWb3dlbCBTcGFjZSBEZW5zaXR5IDc1IERpc3RyaWJ1dGlvbiBieSBFdGlvbG9neQoKdnNkXzc1X3Bsb3QgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IEh1bGxfYlZTRF83NSwKICAgICAgeSA9IEV0aW9sb2d5LAogICAgICBjb2xvciA9IEV0aW9sb2d5LAogICAgICBmaWxsID0gRXRpb2xvZ3kpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGppdHRlcmVkX3BvaW50cyA9IFQsIAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKHdpZHRoID0gMC4wMSwgaGVpZ2h0ID0gMCksIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2hhcGUgPSAnfCcsIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDUsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNywKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gLjcpICsKICBleHBhbmRfbGltaXRzKHg9MCkgKwogIHhsYWIoIlZvd2VsIFNwYWNlIERlbmlzdHkgNzUgKEJhcmspIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyBWaXN1YWwgQW5hbG9nIFNjYWxlIEludGVsbGlnaWJpbGl0eSBSYXRpbmcgRGlzdHJpYnV0aW9uIGJ5IEV0aW9sb2d5CgpWQVNfcGxvdCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gVkFTLAogICAgICB5ID0gRXRpb2xvZ3ksCiAgICAgIGNvbG9yID0gRXRpb2xvZ3ksCiAgICAgIGZpbGwgPSBFdGlvbG9neSkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIlZpc3VhbCBBbmFsb2cgU2NhbGUgKFZBUykiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIE9ydGhvZ3JhcGhpYyBUcmFuc2NyaXB0aW9uIFNjb3JlIERpc3RyaWJ1dGlvbiBieSBFdGlvbG9neQoKT1RfcGxvdCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gdHJhbnNBY2MsCiAgICAgIHkgPSBFdGlvbG9neSwKICAgICAgY29sb3IgPSBFdGlvbG9neSwKICAgICAgZmlsbCA9IEV0aW9sb2d5KSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhqaXR0ZXJlZF9wb2ludHMgPSBULCAKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcih3aWR0aCA9IDAuMDEsIGhlaWdodCA9IDApLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NoYXBlID0gJ3wnLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSA1LAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAxLAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjcsCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IC43KSArCiAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsIDEwMCkpICsKICB4bGFiKCJPcnRob2dyYXBoaWMgVHJhbnNjcmlwdGlvbiBTY29yZXMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIENyZWF0aW5nIERpc3RyaWJ1dGlvbnMgRmlndXJlCgpEaXN0cmlidXRpb25zIDwtIGdncHVicjo6Z2dhcnJhbmdlKFZTQV9wbG90LCBkaXNwX3Bsb3QsIEh1bGxfcGxvdCwgdnNkXzI1X3Bsb3QsIHZzZF81MF9wbG90LCB2c2RfNzVfcGxvdCwgVkFTX3Bsb3QsIE9UX3Bsb3QsCiAgICAgICAgICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgICAgICAgICBucm93ID0gNCkKCiMgU2F2aW5nIERpc3RyaWJ1dGlvbiBGaWd1cmUKCmdnc2F2ZSgiUGxvdHMvRGlzdHJpYnV0aW9uLnBuZyIsIHBsb3QgPSBsYXN0X3Bsb3QoKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gMTAsIHVuaXQgPSAiaW4iKQoKCmBgYAoKIyMjIFNjYXR0ZXIgUGxvdHMKCmBgYHtyfQoKIyBPVCBTY2F0dGVycGxvdHMKCk9UX1ZTQSA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gVlNBX2IsCiAgICAgIHkgPSB0cmFuc0FjYykgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBULCBjb2xvciA9ICIjRTY5RjAwIiwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVm93ZWwgU3BhY2UgQXJlYSAoQmFyayJeMioiKSIpKSArCiAgeWxhYigiUGVyY2VudCBXb3JkcyBDb3JyZWN0IikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEwMCkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIpKQoKT1RfZGlzcCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gdm93ZWxfRURfYiwKICAgICAgeSA9IHRyYW5zQWNjKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFQsIGNvbG9yID0gIiM1NkI0RTkiLCBmaWxsID0gImxpZ2h0IGdyZXkiKSArCiAgeGxhYigiQ29ybmVyIERpc3BlcnNpb24gKEJhcmspIikgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgpPVF9IdWxsIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2IsCiAgICAgIHkgPSB0cmFuc0FjYykgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBULCBjb2xvciA9ICIjMDA5RTczIiwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVm93ZWwgU3BhY2UgSHVsbCAoQmFyayJeMioiKSIpKSArCiAgeWxhYigiUGVyY2VudCBXb3JkcyBDb3JyZWN0IikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEwMCkpICsKICB0aGVtZV9jbGFzc2ljKCkKCk9UX3ZzZDI1IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfMjUsCiAgICAgIHkgPSB0cmFuc0FjYykgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBULCBjb2xvciA9ICIjMDA3MkIyIiwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVm93ZWwgU3BhY2UgRGVuc2l0eSJbMjVdKiIgKEJhcmsiXjIqIikiKSkgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgpPVF92c2Q3NSA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iVlNEXzc1LAogICAgICB5ID0gdHJhbnNBY2MpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVCwgY29sb3IgPSAiI0Q1NUUwMCIsIGZpbGwgPSAibGlnaHQgZ3JleSIpICsKICB4bGFiKGV4cHJlc3Npb24oIlZvd2VsIFNwYWNlIERlbnNpdHkiWzc1XSoiIChCYXJrIl4yKiIpIikpICsKICB5bGFiKCJQZXJjZW50IFdvcmRzIENvcnJlY3QiKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyBDcmVhdGluZyBPVCBTY2F0dGVycGxvdCBGaWd1cmUKCk9UX1NjYXR0ZXJwbG90cyA8LSBnZ3B1YnI6OmdnYXJyYW5nZShPVF9WU0EsIE9UX2Rpc3AsIE9UX0h1bGwsIE9UX3ZzZDI1LCBPVF92c2Q3NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAzLCBucm93ID0gMikKCiMjIFNhdmluZyBPVCBTY2F0dGVycGxvdCBGaWd1cmUKCmdnc2F2ZSgiUGxvdHMvT1RfU2NhdHRlcnBsb3RzLnBuZyIsIHBsb3QgPSBsYXN0X3Bsb3QoKSwgd2lkdGggPSAxNSwgaGVpZ2h0ID0gMTUsIHVuaXQgPSAiaW4iLCBzY2FsZSA9IDAuNikKCiMgVkFTIFNjYXR0ZXJwbG90cwoKVkFTX1ZTQSA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gVlNBX2IsCiAgICAgIHkgPSBWQVMpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVCwgY29sb3IgPSAiI0U2OUYwMCIsIGZpbGwgPSAibGlnaHQgZ3JleSIpICsKICB4bGFiKGV4cHJlc3Npb24oIlZvd2VsIFNwYWNlIEFyZWEgKEJhcmsiXjIqIikiKSkgKwogIHlsYWIoIlZBUyBSYXRpbmciKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9ICJib2xkIikpCgpWQVNfZGlzcCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gdm93ZWxfRURfYiwKICAgICAgeSA9IFZBUykgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBULCBjb2xvciA9ICIjNTZCNEU5IiwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoIkNvcm5lciBEaXNwZXJzaW9uIChCYXJrKSIpICsKICB5bGFiKCJWQVMgUmF0aW5nIikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEwMCkpICsKICB0aGVtZV9jbGFzc2ljKCkKClZBU19IdWxsIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2IsCiAgICAgIHkgPSBWQVMpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVCwgY29sb3IgPSAiIzAwOUU3MyIsIGZpbGwgPSAibGlnaHQgZ3JleSIpICsKICB4bGFiKGV4cHJlc3Npb24oIlZvd2VsIFNwYWNlIEh1bGwgKEJhcmsiXjIqIikiKSkgKwogIHlsYWIoIlZBUyBSYXRpbmciKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKQoKVkFTX3ZzZDI1IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfMjUsCiAgICAgIHkgPSBWQVMpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVCwgY29sb3IgPSAiIzAwNzJCMiIsIGZpbGwgPSAibGlnaHQgZ3JleSIpICsKICB4bGFiKGV4cHJlc3Npb24oIlZvd2VsIFNwYWNlIERlbnNpdHkiWzI1XSoiIChCYXJrIl4yKiIpIikpICsKICB5bGFiKCJWQVMgUmF0aW5nIikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEwMCkpICsKICB0aGVtZV9jbGFzc2ljKCkKClZBU192c2Q3NSA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iVlNEXzc1LAogICAgICB5ID0gVkFTKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFQsIGNvbG9yID0gIiNENTVFMDAiLCBmaWxsID0gImxpZ2h0IGdyZXkiKSArCiAgeGxhYihleHByZXNzaW9uKCJWb3dlbCBTcGFjZSBEZW5zaXR5Ils3NV0qIiAoQmFyayJeMioiKSIpKSArCiAgeWxhYigiVkFTIFJhdGluZyIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIENyZWF0aW5nIFZBUyBTY2F0dGVycGxvdCBGaWd1cmUKClZBU19TY2F0dGVycGxvdHMgPC0gZ2dwdWJyOjpnZ2FycmFuZ2UoVkFTX1ZTQSwgVkFTX2Rpc3AsIFZBU19IdWxsLCBWQVNfdnNkMjUsIFZBU192c2Q3NSwKICAgICAgICAgICAgICAgICAgbmNvbCA9IDMsIG5yb3cgPSAyKQoKIyMgU2F2aW5nIFZBUyBTY2F0dGVycGxvdCBGaWd1cmUKCmdnc2F2ZSgiUGxvdHMvVkFTX1NjYXR0ZXJwbG90cy5wbmciLCBwbG90ID0gbGFzdF9wbG90KCksIHdpZHRoID0gMTUsIGhlaWdodCA9IDE1LCB1bml0ID0gImluIiwgc2NhbGUgPSAuNikKCmBgYAoKCiMjIyBPVCB+IFZBUyBQbG90CgpgYGB7cn0KCiMgVkFTIH4gT1QgUGxvdAoKVkFTX09UIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBWQVMsCiAgICAgIHkgPSB0cmFuc0FjYykgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBULCBjb2xvciA9ICIjQ0M3OUE3IiwgZmlsbCA9ICJsaWdodCBncmV5IikgKyAKICBnZ3RpdGxlKCJSZWxhdGlvbnNoaXAgQmV0d2VlbiBJbnRlbGxpZ2liaWxpdHkgTWVhc3VyZXMiKSArCiAgeGxhYigiVkFTIFJhdGluZyIpICsKICB5bGFiKCJQZXJjZW50IFdvcmRzIENvcnJlY3QiKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gImJvbGQiKSkKCiMgU2F2aW5nIE9UIH4gVkFTIFBsb3QKCmdnc2F2ZSgiUGxvdHMvT1R2YXMucG5nIiwgcGxvdCA9IGxhc3RfcGxvdCgpLCB3aWR0aCA9IDgsIGhlaWdodCA9IDgsIHVuaXQgPSAiaW4iLCBzY2FsZSA9IDAuNikKICAKIyBPVCB+IFZBUyBieSBTZXgKClZBU19PVF9TZXggPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IFZBUywKICAgICAgeSA9IHRyYW5zQWNjLAogICAgICBjb2xvciA9IFNleCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGKSArCiAgeGxhYigiVkFTIFJhdGluZyIpICsKICB5bGFiKCJQZXJjZW50IFdvcmRzIENvcnJlY3QiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3NhdmUoIlBsb3RzL09UdmFzX3NleC5wbmciLCBwbG90ID0gbGFzdF9wbG90KCksIHdpZHRoID0gNSwgaGVpZ2h0ID0gNSwgdW5pdCA9ICJpbiIsIHNjYWxlID0gMC42KQoKIyBPVCB+IFZBUyBieSBFdGlvbG9neQoKVkFTX09UX0V0aW9sb2d5IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBWQVMsCiAgICAgIHkgPSB0cmFuc0FjYywKICAgICAgY29sb3IgPSBFdGlvbG9neSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGKSArCiAgeGxhYigiVkFTIFJhdGluZyIpICsKICB5bGFiKCJQZXJjZW50IFdvcmRzIENvcnJlY3QiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3NhdmUoIlBsb3RzL09UdmFzX2V0aW9sb2d5LnBuZyIsIHBsb3QgPSBsYXN0X3Bsb3QoKSwgd2lkdGggPSA1LCBoZWlnaHQgPSA1LCB1bml0ID0gImluIiwgc2NhbGUgPSAwLjYpCgpgYGAKCgojIEdyb3VwIENvbXBhcmlzb25zCgojIyBWU0EKCmBgYHtyfQoKIyMgU3BlY2lmeSB0aGUgTW9kZWwKVlNBX2dyb3VwIDwtIGFvdihWU0FfYiB+IEV0aW9sb2d5LCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgQXNzdW1wdGlvbiBDaGVjawoKcGxvdChWU0FfZ3JvdXAsIDEpCnBsb3QoVlNBX2dyb3VwLCAyKQpjYXI6OmxldmVuZVRlc3QoVlNBX2dyb3VwKQpWU0FfcmVzaWR1YWxzIDwtIHJlc2lkdWFscyhvYmplY3QgPSBWU0FfZ3JvdXApCnNoYXBpcm8udGVzdChWU0FfcmVzaWR1YWxzKQoKIyMgTW9kZWwgUmVzdWx0cwoKc3VtbWFyeShWU0FfZ3JvdXApCgojIyBLcnVza2FsLVdhbGxpcyBUZXN0IAoKa3J1c2thbC50ZXN0KFZTQV9iIH4gRXRpb2xvZ3ksIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBQYWlyd2lzZSBDb21wYXJpc29ucwoKcGFpcndpc2Uud2lsY294LnRlc3QoQWNvdXN0aWNEYXRhJFZTQV9iLCBBY291c3RpY0RhdGEkRXRpb2xvZ3ksIHAuYWRqdXN0Lm1ldGhvZCA9ICJib25mZXJyb25pIikKCmBgYAoKIyMgQ29ybmVyIERpc3BlcnNpb24KCmBgYHtyfQoKIyMgU3BlY2lmeSB0aGUgTW9kZWwKZGlzcF9ncm91cCA8LSBhb3Yodm93ZWxfRURfYiB+IEV0aW9sb2d5LCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgQXNzdW1wdGlvbiBDaGVjawoKcGxvdChkaXNwX2dyb3VwLCAxKQpwbG90KGRpc3BfZ3JvdXAsIDIpCmNhcjo6bGV2ZW5lVGVzdChkaXNwX2dyb3VwKQpkaXNwX3Jlc2lkdWFscyA8LSByZXNpZHVhbHMob2JqZWN0ID0gZGlzcF9ncm91cCkKc2hhcGlyby50ZXN0KGRpc3BfcmVzaWR1YWxzKQoKIyMgTW9kZWwgUmVzdWx0cwoKc3VtbWFyeShkaXNwX2dyb3VwKQoKYGBgCgojIyBIdWxsCgpgYGB7cn0KCiMjIFNwZWNpZnkgdGhlIE1vZGVsCmh1bGxfZ3JvdXAgPC0gYW92KEh1bGxfYiB+IEV0aW9sb2d5LCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgQXNzdW1wdGlvbiBDaGVjawoKcGxvdChodWxsX2dyb3VwLCAxKQpwbG90KGh1bGxfZ3JvdXAsIDIpCmNhcjo6bGV2ZW5lVGVzdChodWxsX2dyb3VwKQpodWxsX3Jlc2lkdWFscyA8LSByZXNpZHVhbHMob2JqZWN0ID0gaHVsbF9ncm91cCkKc2hhcGlyby50ZXN0KGh1bGxfcmVzaWR1YWxzKQoKIyMgTW9kZWwgUmVzdWx0cwoKc3VtbWFyeShodWxsX2dyb3VwKQoKYGBgCgojIyBWU0QgMjUKCmBgYHtyfQoKIyMgU3BlY2lmeSB0aGUgTW9kZWwKdnNkMjVfZ3JvdXAgPC0gYW92KEh1bGxfYlZTRF8yNSB+IEV0aW9sb2d5LCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgQXNzdW1wdGlvbiBDaGVjawoKcGxvdCh2c2QyNV9ncm91cCwgMSkKcGxvdCh2c2QyNV9ncm91cCwgMikKY2FyOjpsZXZlbmVUZXN0KHZzZDI1X2dyb3VwKQp2c2QyNV9yZXNpZHVhbHMgPC0gcmVzaWR1YWxzKG9iamVjdCA9IHZzZDI1X2dyb3VwKQpzaGFwaXJvLnRlc3QodnNkMjVfcmVzaWR1YWxzKQoKIyMgTW9kZWwgU3VtbWFyeQoKc3VtbWFyeSh2c2QyNV9ncm91cCkKCgpgYGAKCgojIyBWU0QgNTAKCmBgYHtyfQoKIyMgU3BlY2lmeSB0aGUgTW9kZWwKdnNkNTBfZ3JvdXAgPC0gYW92KEh1bGxfYlZTRF81MCB+IEV0aW9sb2d5LCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgQXNzdW1wdGlvbiBDaGVjawoKcGxvdCh2c2Q1MF9ncm91cCwgMSkKcGxvdCh2c2Q1MF9ncm91cCwgMikKY2FyOjpsZXZlbmVUZXN0KHZzZDUwX2dyb3VwKQp2c2Q1MF9yZXNpZHVhbHMgPC0gcmVzaWR1YWxzKG9iamVjdCA9IHZzZDUwX2dyb3VwKQpzaGFwaXJvLnRlc3QodnNkNTBfcmVzaWR1YWxzKQoKIyMgTW9kZWwgUmVzdWx0cwoKc3VtbWFyeSh2c2Q1MF9ncm91cCkKCiMjIEtydXNrYWwgV2FsbGlzIFRlc3QKCmtydXNrYWwudGVzdChIdWxsX2JWU0RfNTAgfiBFdGlvbG9neSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCmBgYAoKIyMgVlNEIDc1CgpgYGB7cn0KCiMjIFNwZWNpZnkgdGhlIE1vZGVsCnZzZDc1X2dyb3VwIDwtIGFvdihIdWxsX2JWU0RfNzUgfiBFdGlvbG9neSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIEFzc3VtcHRpb24gQ2hlY2sKCnBsb3QodnNkNzVfZ3JvdXAsIDEpCnBsb3QodnNkNzVfZ3JvdXAsIDIpCmNhcjo6bGV2ZW5lVGVzdCh2c2Q3NV9ncm91cCkKdnNkNzVfcmVzaWR1YWxzIDwtIHJlc2lkdWFscyhvYmplY3QgPSB2c2Q3NV9ncm91cCkKc2hhcGlyby50ZXN0KHZzZDc1X3Jlc2lkdWFscykKCiMjIE1vZGVsIFN1bW1hcnkKCnN1bW1hcnkodnNkNzVfZ3JvdXApCgojIyBLcnVza2FsIFdhbGxpcwoKa3J1c2thbC50ZXN0KEh1bGxfYlZTRF83NSB+IEV0aW9sb2d5LCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKYGBgCgojIyBWQVMgCgpgYGB7cn0KCiMjIFNwZWNpZnkgdGhlIE1vZGVsClZBU19ncm91cCA8LSBhb3YoVkFTIH4gU2V4KkV0aW9sb2d5LCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgQXNzdW1wdGlvbiBDaGVjawoKcGxvdChWQVNfZ3JvdXAsIDEpCnBsb3QoVkFTX2dyb3VwLCAyKQpjYXI6OmxldmVuZVRlc3QoVkFTX2dyb3VwKQpWQVNfcmVzaWR1YWxzIDwtIHJlc2lkdWFscyhvYmplY3QgPSBWQVNfZ3JvdXApCnNoYXBpcm8udGVzdChWQVNfcmVzaWR1YWxzKQoKIyMgTW9kZWwgUmVzdWx0cwoKc3VtbWFyeShWQVNfZ3JvdXApCgpgYGAKCiMjIE9UCgpgYGB7cn0KCiMjIFNwZWNpZnkgdGhlIE1vZGVsCk9UX2dyb3VwIDwtIGFvdih0cmFuc0FjYyB+IFNleCpFdGlvbG9neSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIEFzc3VtcHRpb24gQ2hlY2sKCnBsb3QoT1RfZ3JvdXAsIDEpCnBsb3QoT1RfZ3JvdXAsIDIpCmNhcjo6bGV2ZW5lVGVzdChPVF9ncm91cCkKT1RfcmVzaWR1YWxzIDwtIHJlc2lkdWFscyhvYmplY3QgPSBPVF9ncm91cCkKc2hhcGlyby50ZXN0KE9UX3Jlc2lkdWFscykKCiMjIE1vZGVsIFJlc3VsdHMKCnN1bW1hcnkoT1RfZ3JvdXApCgpgYGAKCiMgTW9kZWxpbmcgSW50ZWxsaWdpYmlsaXR5CgojIyBPcnRob2dyYXBoaWMgVHJhbnNjcmlwdGlvbnMKCiMjIyBNb2RlbCAxCgpgYGB7cn0KCiMgU3BlY2lmeWluZyBNb2RlbCAxCgpPVF9Nb2RlbDEgPC0gbG0odHJhbnNBY2MgfiBIdWxsX2JWU0RfMjUsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCAxIEFzc3VtcHRpb25zIAoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsMSkKCiMjIE1vZGVsIDEgU3VtbWFyeQoKc3VtbWFyeShPVF9Nb2RlbDEpCgpgYGAKCiMjIyBNb2RlbCAyCgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgMgoKT1RfTW9kZWwyIDwtIGxtKHRyYW5zQWNjIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1LCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgMiBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoT1RfTW9kZWwyKQoKIyMgTW9kZWwgMiBTdW1tYXJ5CgpzdW1tYXJ5KE9UX01vZGVsMikKCiMjIE1vZGVsIDEgYW5kIE1vZGVsIDIgQ29tcGFyaXNvbgoKYW5vdmEoT1RfTW9kZWwxLCBPVF9Nb2RlbDIpCgpgYGAKCiMjIyBNb2RlbCAzCgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgMwoKT1RfTW9kZWwzIDwtIGxtKHRyYW5zQWNjIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgMyBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoT1RfTW9kZWwzKQoKIyMgTW9kZWwgMyBTdW1tYXJ5CgpzdW1tYXJ5KE9UX01vZGVsMykKCiMjIE1vZGVsIDIgYW5kIE1vZGVsIDMgQ29tcGFyaXNvbgoKYW5vdmEoT1RfTW9kZWwyLCBPVF9Nb2RlbDMpCgpgYGAKCiMjIyBNb2RlbCA0CgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgNAoKT1RfTW9kZWw0IDwtIGxtKHRyYW5zQWNjIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCA0IEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChPVF9Nb2RlbDQpCgojIyBNb2RlbCA0IFN1bW1hcnkKCnN1bW1hcnkoT1RfTW9kZWw0KQoKIyMgTW9kZWwgMyBhbmQgTW9kZWwgNCBDb21wYXJpc29uCgphbm92YShPVF9Nb2RlbDMsIE9UX01vZGVsNCkKCmBgYAojIyMgTW9kZWwgNQoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDUKCk9UX01vZGVsNSA8LSBsbSh0cmFuc0FjYyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiArIFZTQV9iICsgdm93ZWxfRURfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDQgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsNSkKCiMjIE1vZGVsIDQgU3VtbWFyeQoKc3VtbWFyeShPVF9Nb2RlbDUpCgojIyBNb2RlbCAzIGFuZCBNb2RlbCA0IENvbXBhcmlzb24KCmFub3ZhKE9UX01vZGVsNCwgT1RfTW9kZWw1KQoKYGBgCgoKIyMjIEZpbmFsIE1vZGVsCgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgRmluYWwgTW9kZWwKCk9UX01vZGVsX2ZpbmFsIDwtIGxtKHRyYW5zQWNjIH4gVlNBX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBGaW5hbCBNb2RlbCBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoT1RfTW9kZWxfZmluYWwpCgojIyBGaW5hbCBNb2RlbCBTdW1tYXJ5CgpzdW1tYXJ5KE9UX01vZGVsX2ZpbmFsKQoKYGBgCgoKIyMgVkFTIE1vZGVscwoKIyMjIE1vZGVsIDEKCmBgYHtyfQoKIyBTcGVjaWZ5aW5nIE1vZGVsIDEKClZBU19Nb2RlbDEgPC0gbG0oVkFTIH4gSHVsbF9iVlNEXzI1LCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgMSBBc3N1bXB0aW9ucyAKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfTW9kZWwxKQoKIyMgTW9kZWwgMSBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbDEpCgpgYGAKCiMjIyBNb2RlbCAyCgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgMgoKVkFTX01vZGVsMiA8LSBsbShWQVMgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCAyIEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfTW9kZWwyKQoKIyMgTW9kZWwgMiBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbDIpCgojIyBNb2RlbCAxIGFuZCBNb2RlbCAyIENvbXBhcmlzb24KCmFub3ZhKFZBU19Nb2RlbDEsIFZBU19Nb2RlbDIpCgpgYGAKCiMjIyBNb2RlbCAzCgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgMwoKVkFTX01vZGVsMyA8LSBsbShWQVMgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUgKyBIdWxsX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCAzIEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfTW9kZWwzKQoKIyMgTW9kZWwgMyBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbDMpCgojIyBNb2RlbCAyIGFuZCBNb2RlbCAzIENvbXBhcmlzb24KCmFub3ZhKFZBU19Nb2RlbDIsIFZBU19Nb2RlbDMpCgpgYGAKCiMjIyBNb2RlbCA0CgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgNAoKVkFTX01vZGVsNCA8LSBsbShWQVMgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUgKyBIdWxsX2IgKyBWU0FfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDQgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU19Nb2RlbDQpCgojIyBNb2RlbCA0IFN1bW1hcnkKCnN1bW1hcnkoVkFTX01vZGVsNCkKCiMjIE1vZGVsIDMgYW5kIE1vZGVsIDQgQ29tcGFyaXNvbgoKYW5vdmEoVkFTX01vZGVsMywgVkFTX01vZGVsNCkKCmBgYAoKIyMjIE1vZGVsIDUKCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCA1CgpWQVNfTW9kZWw1IDwtIGxtKFZBUyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiArIFZTQV9iICsgdm93ZWxfRURfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDUgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU19Nb2RlbDUpCgojIyBNb2RlbCA1IFN1bW1hcnkKCnN1bW1hcnkoVkFTX01vZGVsNSkKCiMjIE1vZGVsIDQgYW5kIE1vZGVsIDUgQ29tcGFyaXNvbgoKYW5vdmEoVkFTX01vZGVsNCwgVkFTX01vZGVsNSkKCmBgYAoKCiMjIyBGaW5hbCBNb2RlbAoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIEZpbmFsIE1vZGVsCgpWQVNfTW9kZWxfZmluYWwgPC0gbG0oVkFTIH4gVlNBX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBGaW5hbCBNb2RlbCBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoVkFTX01vZGVsX2ZpbmFsKQoKIyMgRmluYWwgTW9kZWwgU3VtbWFyeQoKc3VtbWFyeShWQVNfTW9kZWxfZmluYWwpCgpgYGAKIyMgUmVsYXRpb25zaGlwIGJldHdlZW4gT1QgYW5kIFZBUwoKIyMjIFRlc3RlZCBNb2RlbAoKYGBge3J9CgojIFNwZWNpZnkgTW9kZWwKCk9UX1ZBU19tb2RlbCA8LSBsbSh0cmFuc0FjYyB+IFZBUypFdGlvbG9neSArIFZBUypTZXgsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChPVF9WQVNfbW9kZWwpCgojIE1vZGVsIFJlc3VsdHMKCnN1bW1hcnkoT1RfVkFTX21vZGVsKQoKYGBgCgojIyBGaW5hbCBNb2RlbAoKYGBge3J9CgojIFNwZWNpZnkgRmluYWwgTW9kZWwKCk9UX1ZBU19maW5hbCA8LSBsbSh0cmFuc0FjYyB+IFZBUywgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMgTW9kZWwgUmVzdWx0cwoKc3VtbWFyeShPVF9WQVNfZmluYWwpCgpgYGAKCiMgQWx0ZXJuYXRlIEFuYWx5c2lzCgpJbiB0aGlzIGFsdGVybmF0ZSBhbmFseXNpcywgd2UgYXJlIGxvb2tpbmcgYXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZXNlIGFjb3VzdGljIG1lYXN1cmVzIHdpdGggc3BlZWNoIGludGVsbGlnaWJpbGl0eSBmb3IgdGhlIEFMUy9QRCBhbmQgdGhlIEhEL0F0YXhpYyBzcGVha2VycyBzZXBhcmF0ZWx5LiBXZSBjcmVhdGUgYSBuZXcgdmFyaWFibGUgY2FsbGVkIEluY29vcmQsIHdoZXJlIHRoZSBBTFMvUEQgU3BlYWtlcnMgYXJlIHNldCBhcyB0aGUgcmVmZXJlbmNlIGdyb3VwIChpbiBvcmRlciB0byBjb21wYXJlIHRvIHRoZSBBdGF4aWMvSEQgU3BlYWtlciBHcm91cCkuIEdyb3VwIENvbXBhcmlzb25zLCBhZGRpdGlvbmFsIGRhdGEgdmlzdWFsaXphdGlvbnMsIGFuZCBmdXJ0aGVyIGxpbmVhciBtb2RlbCBjb21wYXJpc29ucyBhcmUgY29tcGxldGVkLgoKIyMgRGF0YSBQcmVwCgpgYGB7cn0KCiMgQ3JlYXRpbmcgYSBuZXcgdmFyaWFibGUgaW4gQWNvdXN0aWNEYXRhLiBJbmNvb3JkIGlzIGEgZHVtbXkgdmFyaWFibGUuIEFMUy9QRCBTcGVha2VycyA9IDAsIEhEL0F0YXhpYyA9IDEKCkFjb3VzdGljRGF0YSA8LSBBY291c3RpY0RhdGEgJT4lCiAgZHBseXI6Om11dGF0ZShJbmNvb3JkID0gY2FzZV93aGVuKEV0aW9sb2d5ID09ICJIRCIgfiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdGlvbG9neSA9PSAiQXRheGljIiB+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAwKSkgJT4lCiAgZHBseXI6Om11dGF0ZShJbmNvb3JkID0gYXMuZmFjdG9yKEluY29vcmQpKQoKYGBgCgojIyBEZXNjcmlwdGl2ZXMgCgpgYGB7cn0KCkRlc2NyaXB0aXZlc19BTFMuUERfaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZHBseXI6Omdyb3VwX2J5KEluY29vcmQpICU+JQogIGRwbHlyOjpzdW1tYXJpemUoVlNBX21lYW4gPSBtZWFuKFZTQV9iLCBuYS5ybSA9VCksIFZTQV9zZCA9IHNkKFZTQV9iLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgICAgRGlzcF9tZWFuID0gbWVhbih2b3dlbF9FRF9iLCBuYS5ybSA9VCksIERpc3Bfc2QgPSBzZCh2b3dlbF9FRF9iLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBIdWxsX21lYW4gPSBtZWFuKEh1bGxfYiwgbmEucm0gPVQpLCBIdWxsX3NkID0gc2QoSHVsbF9iLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWU0QyNV9tZWFuID0gbWVhbihIdWxsX2JWU0RfMjUsIG5hLnJtID1UKSwgVlNEMjVfc2QgPSBzZChIdWxsX2JWU0RfMjUsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZTRDUwX21lYW4gPSBtZWFuKEh1bGxfYlZTRF81MCwgbmEucm0gPVQpLCBWU0Q1MF9zZCA9IHNkKEh1bGxfYlZTRF81MCwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVlNENzVfbWVhbiA9IG1lYW4oSHVsbF9iVlNEXzc1LCBuYS5ybSA9VCksIFZTRDc1X3NkID0gc2QoSHVsbF9iVlNEXzc1LCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWQVNfbWVhbiA9IG1lYW4oVkFTLCBuYS5ybSA9VCksIFZBU19zZCA9IHNkKFZBUywgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgT1RfbWVhbiA9IG1lYW4odHJhbnNBY2MsIG5hLnJtID1UKSwgT1Rfc2QgPSBzZCh0cmFuc0FjYywgbmEucm0gPVQpKQoKRGVzY3JpcHRpdmVzX0FMUy5QRF9pbmNvb3JkCgpgYGAKCiMjIERhdGEgVmlzCgojIyMgR3JvdXAgQ29tcGFyaXNvbiBSaWRnZWxpbmUgUGxvdHMKCmBgYHtyfQoKIyBWU0EgUmlkZ2VsaW5lIFBsb3QgYnkgSW5jb29yZGluYXRpb24gKEluY29vcmQgPSAwIGFyZSBBTFMvUEQgU3BlYWtlcnMsIEluY29vcmQgPT0gMSBhcmUgSEQvQXRheGljIFNwZWFrZXJzKQoKVlNBX2luY29vcmQucGxvdCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gVlNBX2IsCiAgICAgIHkgPSBJbmNvb3JkLAogICAgICBjb2xvciA9IEluY29vcmQsCiAgICAgIGZpbGwgPSBJbmNvb3JkKSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhqaXR0ZXJlZF9wb2ludHMgPSBULCAKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcih3aWR0aCA9IDAuMDEsIGhlaWdodCA9IDApLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NoYXBlID0gJ3wnLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSA1LAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAxLAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjcsCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IC43KSArCiAgeGxhYigiVm93ZWwgU3BhY2UgQXJlYSAoQmFyaykiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIENvcm5lciBEaXNwZXJzaW9uIFJpZGdlbGluZSBQbG90IGJ5IEluY29vcmRpbmF0aW9uIChJbmNvb3JkID0gMCBhcmUgQUxTL1BEIFNwZWFrZXJzLCBJbmNvb3JkID09IDEgYXJlIEhEL0F0YXhpYyBTcGVha2VycykKCmRpc3BfaW5jb29yZC5wbG90IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB2b3dlbF9FRF9iLAogICAgICB5ID0gSW5jb29yZCwKICAgICAgY29sb3IgPSBJbmNvb3JkLAogICAgICBmaWxsID0gSW5jb29yZCkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIkNvcm5lciBEaXNwZXJzaW9uIChCYXJrKSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgSHVsbCBSaWRnZWxpbmUgUGxvdCBieSBJbmNvb3JkaW5hdGlvbiAoSW5jb29yZCA9IDAgYXJlIEFMUy9QRCBTcGVha2VycywgSW5jb29yZCA9PSAxIGFyZSBIRC9BdGF4aWMgU3BlYWtlcnMpCgpodWxsX2luY29vcmQucGxvdCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iLAogICAgICB5ID0gSW5jb29yZCwKICAgICAgY29sb3IgPSBJbmNvb3JkLAogICAgICBmaWxsID0gSW5jb29yZCkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIlZvd2VsIFNwYWNlIEh1bGwgKEJhcmspIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyBWU0QgMjUgUmlkZ2VsaW5lIFBsb3QgYnkgSW5jb29yZGluYXRpb24gKEluY29vcmQgPSAwIGFyZSBBTFMvUEQgU3BlYWtlcnMsIEluY29vcmQgPT0gMSBhcmUgSEQvQXRheGljIFNwZWFrZXJzKQoKdnNkMjVfaW5jb29yZC5wbG90IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfMjUsCiAgICAgIHkgPSBJbmNvb3JkLAogICAgICBjb2xvciA9IEluY29vcmQsCiAgICAgIGZpbGwgPSBJbmNvb3JkKSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhqaXR0ZXJlZF9wb2ludHMgPSBULCAKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcih3aWR0aCA9IDAuMDEsIGhlaWdodCA9IDApLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NoYXBlID0gJ3wnLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSA1LAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAxLAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjcsCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IC43KSArCiAgeGxhYigiVm93ZWwgU3BhY2UgRGVzbml0eSAyNSAoQmFyaykiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIFZTRCA1MCBSaWRnZWxpbmUgUGxvdCBieSBJbmNvb3JkaW5hdGlvbiAoSW5jb29yZCA9IDAgYXJlIEFMUy9QRCBTcGVha2VycywgSW5jb29yZCA9PSAxIGFyZSBIRC9BdGF4aWMgU3BlYWtlcnMpCgp2c2Q1MF9pbmNvb3JkLnBsb3QgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IEh1bGxfYlZTRF81MCwKICAgICAgeSA9IEluY29vcmQsCiAgICAgIGNvbG9yID0gSW5jb29yZCwKICAgICAgZmlsbCA9IEluY29vcmQpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGppdHRlcmVkX3BvaW50cyA9IFQsIAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKHdpZHRoID0gMC4wMSwgaGVpZ2h0ID0gMCksIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2hhcGUgPSAnfCcsIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDUsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNywKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gLjcpICsKICB4bGFiKCJWb3dlbCBTcGFjZSBEZXNuaXR5IDUwIChCYXJrKSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgVlNEIDc1IFJpZGdlbGluZSBQbG90IGJ5IEluY29vcmRpbmF0aW9uIChJbmNvb3JkID0gMCBhcmUgQUxTL1BEIFNwZWFrZXJzLCBJbmNvb3JkID09IDEgYXJlIEhEL0F0YXhpYyBTcGVha2VycykKCnZzZDc1X2luY29vcmQucGxvdCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iVlNEXzc1LAogICAgICB5ID0gSW5jb29yZCwKICAgICAgY29sb3IgPSBJbmNvb3JkLAogICAgICBmaWxsID0gSW5jb29yZCkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIlZvd2VsIFNwYWNlIERlc25pdHkgNzUgKEJhcmspIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyBPcnRob2dyYXBoaWMgVHJhbnNjcmlwdGlvbiBSaWRnZWxpbmUgUGxvdCBieSBJbmNvb3JkaW5hdGlvbiAoSW5jb29yZCA9IDAgYXJlIEFMUy9QRCBTcGVha2VycywgSW5jb29yZCA9PSAxIGFyZSBIRC9BdGF4aWMgU3BlYWtlcnMpCgpPVF9pbmNvb3JkLnBsb3QgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IHRyYW5zQWNjLAogICAgICB5ID0gSW5jb29yZCwKICAgICAgY29sb3IgPSBJbmNvb3JkLAogICAgICBmaWxsID0gSW5jb29yZCkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgVmlzdWFsIEFuYWxvZyBTY2FsZSBJbnRlbGxpZ2liaWxpdHkgUmF0aW5nIFJpZGdlbGluZSBQbG90IGJ5IEluY29vcmRpbmF0aW9uIChJbmNvb3JkID0gMCBhcmUgQUxTL1BEIFNwZWFrZXJzLCBJbmNvb3JkID09IDEgYXJlIEhEL0F0YXhpYyBTcGVha2VycykKClZBU19pbmNvb3JkLnBsb3QgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IFZBUywKICAgICAgeSA9IEluY29vcmQsCiAgICAgIGNvbG9yID0gSW5jb29yZCwKICAgICAgZmlsbCA9IEluY29vcmQpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGppdHRlcmVkX3BvaW50cyA9IFQsIAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKHdpZHRoID0gMC4wMSwgaGVpZ2h0ID0gMCksIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2hhcGUgPSAnfCcsIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDUsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNywKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gLjcpICsKICB4bGFiKCJSYXRpZ25zIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyBDcmVhdGluZyBEaXN0cmlidXRpb25zIGJ5IEluY29vcmQgRmlndXJlCgpEaXN0cmlidXRpb25zX2luY29vcmQgPC0gZ2dwdWJyOjpnZ2FycmFuZ2UoVlNBX2luY29vcmQucGxvdCwgZGlzcF9pbmNvb3JkLnBsb3QsIGh1bGxfaW5jb29yZC5wbG90LCB2c2QyNV9pbmNvb3JkLnBsb3QsIHZzZDUwX2luY29vcmQucGxvdCwgdnNkNzVfaW5jb29yZC5wbG90LCBPVF9pbmNvb3JkLnBsb3QsIFZBU19pbmNvb3JkLnBsb3QsCiAgICAgICAgICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgICAgICAgICBucm93ID0gNCkKCiMgU2F2aW5nIERpc3RyaWJ1dGlvbiBGaWd1cmUKCmdnc2F2ZSgiUGxvdHMvRGlzdHJpYnV0aW9uX2luY29vcmQucG5nIiwgcGxvdCA9IGxhc3RfcGxvdCgpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMCwgdW5pdCA9ICJpbiIpCgpgYGAKCiMjIyBTY2F0dGVycGxvdHMKCmBgYHtyfQoKIyBPVCBTY2F0dGVycGxvdHMgYnkgSW5jb29yZAoKT1RfVlNBLmluY29vcmQgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IFZTQV9iLAogICAgICB5ID0gdHJhbnNBY2MsCiAgICAgIGNvbG9yID0gSW5jb29yZCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGKSArCiAgeGxhYigiVm93ZWwgU3BhY2UgQXJlYSAoQmFyaykiKSArCiAgeWxhYigiUGVyY2VudCBXb3JkcyBDb3JyZWN0IikgKwogIGdndGl0bGUoIk9ydGhvZ3JhcGhpYyBUcmFuc2NyaXB0aW9uIikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEwMCkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIpKQoKT1RfZGlzcC5pbmNvb3JkIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB2b3dlbF9FRF9iLAogICAgICB5ID0gdHJhbnNBY2MsCiAgICAgIGNvbG9yID0gSW5jb29yZCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGKSArCiAgeGxhYigiQ29ybmVyIERpc3BlcnNpb24gKEJhcmspIikgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgpPVF9IdWxsLmluY29vcmQgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IEh1bGxfYiwKICAgICAgeSA9IHRyYW5zQWNjLAogICAgICBjb2xvciA9IEluY29vcmQpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIHhsYWIoIlZvd2VsIFNwYWNlIEh1bGwgKEJhcmspIikgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgpPVF92c2QyNS5pbmNvb3JkIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfMjUsCiAgICAgIHkgPSB0cmFuc0FjYywKICAgICAgY29sb3IgPSBJbmNvb3JkKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEYpICsKICB4bGFiKCJWb3dlbCBTcGFjZSBEZW5zaXR5IDI1IChCYXJrKSIpICsKICB5bGFiKCJQZXJjZW50IFdvcmRzIENvcnJlY3QiKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKQoKT1RfdnNkNzUuaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iVlNEXzc1LAogICAgICB5ID0gdHJhbnNBY2MsCiAgICAgIGNvbG9yID0gSW5jb29yZCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGKSArCiAgeGxhYigiVm93ZWwgU3BhY2UgRGVuc2l0eSA3NSAoQmFyaykiKSArCiAgeWxhYigiUGVyY2VudCBXb3JkcyBDb3JyZWN0IikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEwMCkpICsKICB0aGVtZV9jbGFzc2ljKCkKCgojIFZBUyBTY2F0dGVycGxvdHMKClZBU19WU0EuaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gVlNBX2IsCiAgICAgIHkgPSBWQVMsCiAgICAgIGNvbG9yID0gSW5jb29yZCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGKSArCiAgeGxhYigiVm93ZWwgU3BhY2UgQXJlYSAoQmFyaykiKSArCiAgeWxhYigiVkFTIFNjb3JlIikgKwogIGdndGl0bGUoIlZpc3VhbCBBbmFsb2cgU2NhbGUiKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9ICJib2xkIikpCgpWQVNfZGlzcC5pbmNvb3JkIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB2b3dlbF9FRF9iLAogICAgICB5ID0gVkFTLAogICAgICBjb2xvciA9IEluY29vcmQpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIHhsYWIoIkNvcm5lciBEaXNwZXJzaW9uIChCYXJrKSIpICsKICB5bGFiKCJWQVMgU2NvcmUiKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKQoKVkFTX0h1bGwuaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iLAogICAgICB5ID0gVkFTLAogICAgICBjb2xvciA9IEluY29vcmQpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIHhsYWIoIlZvd2VsIFNwYWNlIEh1bGwgKEJhcmspIikgKwogIHlsYWIoIlZBUyBTY29yZSIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgpWQVNfdnNkMjUuaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iVlNEXzI1LAogICAgICB5ID0gVkFTLAogICAgICBjb2xvciA9IEluY29vcmQpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIHhsYWIoIlZvd2VsIFNwYWNlIERlbnNpdHkgMjUgKEJhcmspIikgKwogIHlsYWIoIlZBUyBTY29yZSIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgpWQVNfdnNkNzUuaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iVlNEXzc1LAogICAgICB5ID0gVkFTLAogICAgICBjb2xvciA9IEluY29vcmQpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIHhsYWIoIlZvd2VsIFNwYWNlIERlbnNpdHkgNzUgKEJhcmspIikgKwogIHlsYWIoIlZBUyBTY29yZSIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgoKIyBDcmVhdGluZyBTY2F0dGVycGxvdCBGaWd1cmUKClNjYXR0ZXJwbG90c19pbmNvb3JkIDwtIGdncHVicjo6Z2dhcnJhbmdlKE9UX1ZTQS5pbmNvb3JkLCBWQVNfVlNBLmluY29vcmQsIE9UX2Rpc3AuaW5jb29yZCwgVkFTX2Rpc3AuaW5jb29yZCwgT1RfSHVsbC5pbmNvb3JkLCBWQVNfSHVsbC5pbmNvb3JkLCBPVF92c2QyNS5pbmNvb3JkLCBWQVNfdnNkMjUuaW5jb29yZCwgT1RfdnNkNzUuaW5jb29yZCwgVkFTX3ZzZDc1LmluY29vcmQsCiAgICAgICAgICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgICAgICAgICBucm93ID0gNSkKCiMjIFNhdmluZyBTY2F0dGVycGxvdCBGaWd1cmUKCmdnc2F2ZSgiUGxvdHMvU2NhdHRlcnBsb3RzX2luY29vcmQucG5nIiwgcGxvdCA9IGxhc3RfcGxvdCgpLCB3aWR0aCA9IDE1LCBoZWlnaHQgPSAyMCwgdW5pdCA9ICJpbiIsIHNjYWxlID0gLjUpCgoKYGBgCgoKIyMgR3JvdXAgQ29tcGFyaXNvbnMKCiMjIyBUd28gRGF0YWZyYW1lcyBmb3IgSW5jb29yZCBHcm91cHMKCmBgYHtyfQoKY29vcmQuZ3JvdXAgPC0gQWNvdXN0aWNEYXRhICU+JQogIGRwbHlyOjpmaWx0ZXIoSW5jb29yZCA9PSAwKQoKaW5jb29yZC5ncm91cCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZHBseXI6OmZpbHRlcihJbmNvb3JkID09IDEpCgpgYGAKCgojIyMgVlNBCgpgYGB7cn0KCiMgQXNzdW1wdGlvbiBDaGVjawoKIyMgQ2hlY2tpbmcgTm9ybWFsaXR5Cgp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KFZTQV9iW0luY29vcmQgPT0gMF0pKQp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KFZTQV9iW0luY29vcmQgPT0gMV0pKQoKIyMgRXF1YWwgVmFyaWFuY2UgQ2hlY2sKCnJlcy5mdGVzdC5WU0EgPC0gdmFyLnRlc3QoVlNBX2IgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpyZXMuZnRlc3QuVlNBCgojIE1vZGVsIFJlc3VsdHMKClZTQV9iX3QgPC0gdC50ZXN0KGluY29vcmQuZ3JvdXAkVlNBX2IsIGNvb3JkLmdyb3VwJFZTQV9iLCB2YXIuZXF1YWwgPSBUKQpWU0FfYl90CgpgYGAKCiMjIyBDb3JuZXIgRGlzcGVyc2lvbgoKYGBge3J9CgojIEFzc3VtcHRpb24gQ2hlY2sKCiMjIENoZWNraW5nIE5vcm1hbGl0eQoKd2l0aChBY291c3RpY0RhdGEsIHNoYXBpcm8udGVzdCh2b3dlbF9FRF9iW0luY29vcmQgPT0gMF0pKQp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KHZvd2VsX0VEX2JbSW5jb29yZCA9PSAxXSkpCgojIyBFcXVhbCBWYXJpYW5jZSBDaGVjawoKcmVzLmZ0ZXN0LmRpc3AgPC0gdmFyLnRlc3Qodm93ZWxfRURfYiB+IEluY29vcmQsIGRhdGEgPSBBY291c3RpY0RhdGEpCnJlcy5mdGVzdC5kaXNwCgojIE1vZGVsIFJlc3VsdHMKCmRpc3BfdCA8LSB0LnRlc3QoaW5jb29yZC5ncm91cCR2b3dlbF9FRF9iLCBjb29yZC5ncm91cCR2b3dlbF9FRF9iLCB2YXIuZXF1YWwgPSBUKQpkaXNwX3QKCmBgYAoKIyMjIEh1bGwKCmBgYHtyfQoKIyBBc3N1bXB0aW9uIENoZWNrCgojIyBDaGVja2luZyBOb3JtYWxpdHkKCndpdGgoQWNvdXN0aWNEYXRhLCBzaGFwaXJvLnRlc3QoSHVsbF9iW0luY29vcmQgPT0gMF0pKQp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KEh1bGxfYltJbmNvb3JkID09IDFdKSkKCiMjIEVxdWFsIFZhcmlhbmNlIENoZWNrCgpyZXMuZnRlc3QuaHVsbCA8LSB2YXIudGVzdChIdWxsX2IgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpyZXMuZnRlc3QuaHVsbAoKIyBNb2RlbCBSZXN1bHRzCgpodWxsX3QgPC0gdC50ZXN0KGluY29vcmQuZ3JvdXAkSHVsbF9iLCBjb29yZC5ncm91cCRIdWxsX2IsIHZhci5lcXVhbCA9IFQpCmh1bGxfdAoKYGBgCgojIyMgVlNEIDI1CgpgYGB7cn0KCiMgQXNzdW1wdGlvbiBDaGVjawoKIyMgQ2hlY2tpbmcgTm9ybWFsaXR5Cgp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KEh1bGxfYlZTRF8yNVtJbmNvb3JkID09IDBdKSkKd2l0aChBY291c3RpY0RhdGEsIHNoYXBpcm8udGVzdChIdWxsX2JWU0RfMjVbSW5jb29yZCA9PSAxXSkpCgojIyBFcXVhbCBWYXJpYW5jZSBDaGVjawoKcmVzLmZ0ZXN0LnZzZDI1IDwtIHZhci50ZXN0KEh1bGxfYlZTRF8yNSB+IEluY29vcmQsIGRhdGEgPSBBY291c3RpY0RhdGEpCnJlcy5mdGVzdC52c2QyNQoKIyBNb2RlbCBSZXN1bHRzCgp2c2QyNV90IDwtIHQudGVzdChpbmNvb3JkLmdyb3VwJEh1bGxfYlZTRF8yNSwgY29vcmQuZ3JvdXAkSHVsbF9iVlNEXzI1LCB2YXIuZXF1YWwgPSBUKQp2c2QyNV90CgpgYGAKCiMjIyBWU0QgNTAKCmBgYHtyfQoKIyBBc3N1bXB0aW9uIENoZWNrCgojIyBDaGVja2luZyBOb3JtYWxpdHkKCndpdGgoQWNvdXN0aWNEYXRhLCBzaGFwaXJvLnRlc3QoSHVsbF9iVlNEXzUwW0luY29vcmQgPT0gMF0pKQp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KEh1bGxfYlZTRF81MFtJbmNvb3JkID09IDFdKSkKCiMjIEVxdWFsIFZhcmlhbmNlIENoZWNrCgpyZXMuZnRlc3QudnNkNTAgPC0gdmFyLnRlc3QoSHVsbF9iVlNEXzUwIH4gSW5jb29yZCwgZGF0YSA9IEFjb3VzdGljRGF0YSkKcmVzLmZ0ZXN0LnZzZDUwCgojIE1vZGVsIFJlc3VsdHMgKE1hbm4tV2hpdG5leSBVIHRlc3QgY29uZHVjdGVkIHNpbmNlIGFzc3VtcHRpb24gb2Ygbm9ybWFsaXR5IGlzIHZpb2xhdGVkKQoKdnNkNTBfTVcgPC0gd2lsY294LnRlc3QoSHVsbF9iVlNEXzUwIH4gSW5jb29yZCwgZGF0YSA9IEFjb3VzdGljRGF0YSkKdnNkNTBfTVcKCmBgYAoKIyMjIFZTRCA3NQoKYGBge3J9CgojIEFzc3VtcHRpb24gQ2hlY2sKCiMjIENoZWNraW5nIE5vcm1hbGl0eQoKd2l0aChBY291c3RpY0RhdGEsIHNoYXBpcm8udGVzdChIdWxsX2JWU0RfNzVbSW5jb29yZCA9PSAwXSkpCndpdGgoQWNvdXN0aWNEYXRhLCBzaGFwaXJvLnRlc3QoSHVsbF9iVlNEXzc1W0luY29vcmQgPT0gMV0pKQoKIyMgRXF1YWwgVmFyaWFuY2UgQ2hlY2sKCnJlcy5mdGVzdC52c2Q3NSA8LSB2YXIudGVzdChIdWxsX2JWU0RfNzUgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpyZXMuZnRlc3QudnNkNzUKCiMgTW9kZWwgUmVzdWx0cyAoTWFubi1XaGl0bmV5IFUgdGVzdCBjb25kdWN0ZWQgc2luY2UgYXNzdW1wdGlvbiBvZiBub3JtYWxpdHkgaXMgdmlvbGF0ZWQpCgp2c2Q3NV9NVyA8LSB3aWxjb3gudGVzdChIdWxsX2JWU0RfNzUgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQp2c2Q3NV9NVwoKCmBgYAoKIyMjIE9ydGhvZ3JhcGhpYyBUcmFuc2NyaXB0aW9uIFNjb3JlcwoKYGBge3J9CgojIEFzc3VtcHRpb24gQ2hlY2sKCiMjIENoZWNraW5nIE5vcm1hbGl0eQoKd2l0aChBY291c3RpY0RhdGEsIHNoYXBpcm8udGVzdCh0cmFuc0FjY1tJbmNvb3JkID09IDBdKSkKd2l0aChBY291c3RpY0RhdGEsIHNoYXBpcm8udGVzdCh0cmFuc0FjY1tJbmNvb3JkID09IDFdKSkKCiMjIEVxdWFsIFZhcmlhbmNlIENoZWNrCgpyZXMuZnRlc3QuT1QgPC0gdmFyLnRlc3QodHJhbnNBY2MgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpyZXMuZnRlc3QuT1QKCiMgTW9kZWwgUmVzdWx0cyAoTWFubi1XaGl0bmV5IFUgdGVzdCBjb25kdWN0ZWQgc2luY2UgYXNzdW1wdGlvbiBvZiBub3JtYWxpdHkgaXMgdmlvbGF0ZWQpCgpPVF9NVyA8LSB3aWxjb3gudGVzdCh0cmFuc0FjYyB+IEluY29vcmQsIGRhdGEgPSBBY291c3RpY0RhdGEpCk9UX01XCgpgYGAKCiMjIyBWQVMKCmBgYHtyfQoKIyBBc3N1bXB0aW9uIENoZWNrCgojIyBDaGVja2luZyBOb3JtYWxpdHkKCndpdGgoQWNvdXN0aWNEYXRhLCBzaGFwaXJvLnRlc3QoVkFTW0luY29vcmQgPT0gMF0pKQp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KFZBU1tJbmNvb3JkID09IDFdKSkKCiMjIEVxdWFsIFZhcmlhbmNlIENoZWNrCgpyZXMuZnRlc3QuVkFTIDwtIHZhci50ZXN0KFZBUyB+IEluY29vcmQsIGRhdGEgPSBBY291c3RpY0RhdGEpCnJlcy5mdGVzdC5WQVMKCiMgTW9kZWwgUmVzdWx0cyAoTWFubi1XaGl0bmV5IFUgdGVzdCBjb25kdWN0ZWQgc2luY2UgYXNzdW1wdGlvbiBvZiBub3JtYWxpdHkgaXMgdmlvbGF0ZWQpCgpPVF9NVyA8LSB3aWxjb3gudGVzdChWQVMgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpPVF9NVwoKYGBgCgojIyBPVCBBbmFseXNpcwoKU2luY2Ugd2UgZm91bmQgc2lnbmlmaWNhbnQgZ3JvdXAgZGlmZmVyZW5jZXMgZm9yIHNvbWUgYWNvdXN0aWMgbWVhc3VyZXMgYmV0d2VlbiB0aGUgQUxTL1BEIGFuZCBBdGF4aWMvSEQgZ3JvdXBzLCB3ZSBjb250aW51ZWQgdGhlIGhlaXJhcmljaGFsIHJlZ3Jlc3Npb24gYXBwcm9hY2ggZnJvbSBPVCBNb2RlbCA1LiBBZGRpbmcgaW4gdGhlIEluY29vcmQgcHJlZGljdG9yIGFsb25nIHdpdGggdGhlIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZSBhY291c3RpYyBtZWFzdXJlcyBkaWQgbm90IHNpZ25pZmljYW50bHkgaW1wcm92ZSBtb2RlbCBmaXQuIFNvIG91ciBvcmlnaW5hbCBmaW5hbCBPVCBtb2RlbCBpcyByZXRhaW5lZC4KCiMjIyBNb2RlbCA2CgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgNgoKT1RfTW9kZWw2IDwtIGxtKHRyYW5zQWNjIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iICsgSW5jb29yZCwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDYgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsNikKCiMjIE1vZGVsIDYgU3VtbWFyeQoKc3VtbWFyeShPVF9Nb2RlbDYpCgojIyBNb2RlbCA1IGFuZCBNb2RlbCA2IENvbXBhcmlzb24KCmFub3ZhKE9UX01vZGVsNSwgT1RfTW9kZWw2KQoKYGBgCiMjIyBNb2RlbCA3CgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgNwoKT1RfTW9kZWw3IDwtIGxtKHRyYW5zQWNjIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iICsgCiAgICAgICAgICAgICAgICAgIEluY29vcmQgKyBJbmNvb3JkKkh1bGxfYlZTRF8yNSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDcgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsNykKCiMjIE1vZGVsIDcgU3VtbWFyeQoKc3VtbWFyeShPVF9Nb2RlbDcpCgojIyBNb2RlbCA2IGFuZCBNb2RlbCA3IENvbXBhcmlzb24KCmFub3ZhKE9UX01vZGVsNiwgT1RfTW9kZWw3KQoKYGBgCgojIyMgTW9kZWwgOAoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDgKCk9UX01vZGVsOCA8LSBsbSh0cmFuc0FjYyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiArIFZTQV9iICsgdm93ZWxfRURfYiArIAogICAgICAgICAgICAgICAgICBJbmNvb3JkICsgSW5jb29yZCpIdWxsX2JWU0RfMjUgKyBJbmNvb3JkKkh1bGxfYlZTRF83NSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDggQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsOCkKCiMjIE1vZGVsIDggU3VtbWFyeQoKc3VtbWFyeShPVF9Nb2RlbDgpCgojIyBNb2RlbCA3IGFuZCBNb2RlbCA4IENvbXBhcmlzb24KCmFub3ZhKE9UX01vZGVsNywgT1RfTW9kZWw4KQoKYGBgCgojIyMgTW9kZWwgOQoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDkKCk9UX01vZGVsOSA8LSBsbSh0cmFuc0FjYyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiArIFZTQV9iICsgdm93ZWxfRURfYiArIAogICAgICAgICAgICAgICAgICBJbmNvb3JkICsgSW5jb29yZCpIdWxsX2JWU0RfMjUgKyBJbmNvb3JkKkh1bGxfYlZTRF83NSArIEluY29vcmQqSHVsbF9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgOSBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoT1RfTW9kZWw5KQoKIyMgTW9kZWwgOSBTdW1tYXJ5CgpzdW1tYXJ5KE9UX01vZGVsOSkKCiMjIE1vZGVsIDggYW5kIE1vZGVsIDkgQ29tcGFyaXNvbgoKYW5vdmEoT1RfTW9kZWw4LCBPVF9Nb2RlbDkpCgpgYGAKCiMjIyBNb2RlbCAxMAoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDEwCgpPVF9Nb2RlbDEwIDwtIGxtKHRyYW5zQWNjIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iICsgCiAgICAgICAgICAgICAgICAgIEluY29vcmQgKyBJbmNvb3JkKkh1bGxfYlZTRF8yNSArIEluY29vcmQqSHVsbF9iVlNEXzc1ICsgSW5jb29yZCpIdWxsX2IgKyBJbmNvb3JkKlZTQV9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgMTAgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsMTApCgojIyBNb2RlbCAxMCBTdW1tYXJ5CgpzdW1tYXJ5KE9UX01vZGVsMTApCgojIyBNb2RlbCA5IGFuZCBNb2RlbCAxMCBDb21wYXJpc29uCgphbm92YShPVF9Nb2RlbDksIE9UX01vZGVsMTApCgpgYGAKIyMjIE1vZGVsIDExCgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgMTEKCk9UX01vZGVsMTEgPC0gbG0odHJhbnNBY2MgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUgKyBIdWxsX2IgKyBWU0FfYiArIHZvd2VsX0VEX2IgKyAKICAgICAgICAgICAgICAgICAgSW5jb29yZCArIEluY29vcmQqSHVsbF9iVlNEXzI1ICsgSW5jb29yZCpIdWxsX2JWU0RfNzUgKyBJbmNvb3JkKkh1bGxfYiArIEluY29vcmQqVlNBX2IgKyBJbmNvb3JkKnZvd2VsX0VEX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCAxMSBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoT1RfTW9kZWwxMSkKCiMjIE1vZGVsIDExIFN1bW1hcnkKCnN1bW1hcnkoT1RfTW9kZWwxMSkKCiMjIE1vZGVsIDEwIGFuZCBNb2RlbCAxMSBDb21wYXJpc29uCgphbm92YShPVF9Nb2RlbDEwLCBPVF9Nb2RlbDExKQoKYGBgCgojIyBWQVMgQW5hbHlzaXMKClNpbmNlIHdlIGZvdW5kIHNpZ25pZmljYW50IGdyb3VwIGRpZmZlcmVuY2VzIGZvciBzb21lIGFjb3VzdGljIG1lYXN1cmVzIGJldHdlZW4gdGhlIEFMUy9QRCBhbmQgQXRheGljL0hEIGdyb3Vwcywgd2UgY29udGludWVkIHRoZSBoaWVyYXJjaGljYWwgcmVncmVzc2lvbiBhcHByb2FjaCBmcm9tIFZBUyBNb2RlbCA1LiBWQVMgTW9kZWwgNiBmaXQgc2lnbmlmaWNhbnRseSBiZXR0ZXIgdGhhbiBWQVMgTW9kZWwgNS4gSG93ZXZlciwgYWRkaW5nIGluIHRoZSBpbnRlcmFjdGlvbnMgYmV0d2VlbiBJbmNvb3JkIGFuZCB0aGUgYWNvdXN0aWMgbWVhc3VyZXMgZGlkIG5vdCBzaWduaWZpY2FudGx5IGltcHJvdmUgbW9kZWwgZml0LgoKIyMjIE1vZGVsIDYKCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCA2CgpWQVNfTW9kZWw2IDwtIGxtKFZBUyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiArIFZTQV9iICsgdm93ZWxfRURfYiArIEluY29vcmQsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCA2IEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfTW9kZWw2KQoKIyMgTW9kZWwgNiBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbDYpCgojIyBNb2RlbCA1IGFuZCBNb2RlbCA2IENvbXBhcmlzb24KCmFub3ZhKFZBU19Nb2RlbDUsIFZBU19Nb2RlbDYpCgoKYGBgCgojIyMgTW9kZWwgNwoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDcKClZBU19Nb2RlbDcgPC0gbG0oVkFTIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iICsgCiAgICAgICAgICAgICAgICAgIEluY29vcmQgKyBJbmNvb3JkKkh1bGxfYlZTRF8yNSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDcgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU19Nb2RlbDcpCgojIyBNb2RlbCA3IFN1bW1hcnkKCnN1bW1hcnkoVkFTX01vZGVsNykKCiMjIE1vZGVsIDYgYW5kIE1vZGVsIDcgQ29tcGFyaXNvbgoKYW5vdmEoVkFTX01vZGVsNiwgVkFTX01vZGVsNykKCgpgYGAKCiMjIyBNb2RlbCA4CgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgOAoKVkFTX01vZGVsOCA8LSBsbShWQVMgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUgKyBIdWxsX2IgKyBWU0FfYiArIHZvd2VsX0VEX2IgKyAKICAgICAgICAgICAgICAgICAgSW5jb29yZCArIEluY29vcmQqSHVsbF9iVlNEXzI1ICsgSW5jb29yZCpIdWxsX2JWU0RfNzUsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCA4IEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfTW9kZWw4KQoKIyMgTW9kZWwgOCBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbDgpCgojIyBNb2RlbCA3IGFuZCBNb2RlbCA4IENvbXBhcmlzb24KCmFub3ZhKFZBU19Nb2RlbDcsIFZBU19Nb2RlbDgpCgoKYGBgCgojIyMgTW9kZWwgOQoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDkKClZBU19Nb2RlbDkgPC0gbG0oVkFTIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iICsgCiAgICAgICAgICAgICAgICAgIEluY29vcmQgKyBJbmNvb3JkKkh1bGxfYlZTRF8yNSArIEluY29vcmQqSHVsbF9iVlNEXzc1ICsgSW5jb29yZCpIdWxsX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCA5IEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfTW9kZWw5KQoKIyMgTW9kZWwgOSBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbDkpCgojIyBNb2RlbCA4IGFuZCBNb2RlbCA5IENvbXBhcmlzb24KCmFub3ZhKFZBU19Nb2RlbDgsIFZBU19Nb2RlbDkpCgpgYGAKCiMjIyBNb2RlbCAxMAoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDEwCgpWQVNfTW9kZWwxMCA8LSBsbShWQVMgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUgKyBIdWxsX2IgKyBWU0FfYiArIHZvd2VsX0VEX2IgKyAKICAgICAgICAgICAgICAgICAgSW5jb29yZCArIEluY29vcmQqSHVsbF9iVlNEXzI1ICsgSW5jb29yZCpIdWxsX2JWU0RfNzUgKyBJbmNvb3JkKkh1bGxfYiArIEluY29vcmQqVlNBX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCAxMCBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoVkFTX01vZGVsMTApCgojIyBNb2RlbCAxMCBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbDEwKQoKIyMgTW9kZWwgOSBhbmQgTW9kZWwgMTAgQ29tcGFyaXNvbgoKYW5vdmEoVkFTX01vZGVsOSwgVkFTX01vZGVsMTApCgpgYGAKIyMjIE1vZGVsIDExCgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgMTEKClZBU19Nb2RlbDExIDwtIGxtKFZBUyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiArIFZTQV9iICsgdm93ZWxfRURfYiArIAogICAgICAgICAgICAgICAgICBJbmNvb3JkICsgSW5jb29yZCpIdWxsX2JWU0RfMjUgKyBJbmNvb3JkKkh1bGxfYlZTRF83NSArIEluY29vcmQqSHVsbF9iICsgSW5jb29yZCpWU0FfYiArIEluY29vcmQqdm93ZWxfRURfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDExIEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfTW9kZWwxMSkKCiMjIE1vZGVsIDExIFN1bW1hcnkKCnN1bW1hcnkoVkFTX01vZGVsMTEpCgojIyBNb2RlbCAxMCBhbmQgTW9kZWwgMTEgQ29tcGFyaXNvbgoKYW5vdmEoVkFTX01vZGVsMTAsIFZBU19Nb2RlbDExKQoKYGBgCgojIyMgTmV3IEZpbmFsIFZBUyBNb2RlbAoKU2luY2UgVkFTIE1vZGVsIDYgd2FzIHNpZ25pZmljYW50bHkgYmV0dGVyIGZpdCB0aGFuIE1vZGVsIDUsIHdlIGZpdCBhIG5ldyBmaW5hbCBwYXJzaW1vbmlvdXMgbW9kZWwgZm9yIFZBUyB0byB0aGUgZGF0YSAoVkFTIH4gVlNBX2IgKyBJbmNvb3JkKSBhbmQgY29tcGFyZWQgdGhhdCB0byB0aGUgb2xkIGZpbmFsIFZBUyBtb2RlbCAoVkFTIH4gVlNBX2IpLiBUaGUgbmV3IGZpbmFsIG1vZGVsIHdhcyBub3QgYSBzaWduaWZpY2FudGx5IGJldHRlciBmaXQgdGhhbiB0aGUgb2xkIGZpbmFsIG1vZGVsLiBUaHVzIHRoZSBvbGQgZmluYWwgbW9kZWwgKFZBUyB+IFZTQV9iKSBpcyByZXRhaW5lZC4KCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBOZXcgRmluYWwgVkFTIE1vZGVsCgpWQVNfTW9kZWxfbmV3ZmluYWwgPC0gbG0oVkFTIH4gVlNBX2IgKyBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTmV3IEZpbmFsIFZBUyBNb2RlbCBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoVkFTX01vZGVsX25ld2ZpbmFsKQoKIyMgTmV3IEZpbmFsIFZBUyBNb2RlbCBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbF9uZXdmaW5hbCkKCiMjIENvbXBhcmlzb24gdG8gT2xkIEZpbmFsIE1vZGVsCgphbm92YShWQVNfTW9kZWxfZmluYWwsIFZBU19Nb2RlbF9uZXdmaW5hbCkKCmBgYAoKIyMgVGVzdGluZyBJbmRpdmlkdWFsIFByZWRpY3RvcnMKCkJlY2F1c2Ugc29tZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwcmVkaWN0b3JzIGFyZSBoaWdoLiBXZSBydW4gYSBzZXJpZXMgb2Ygc2ltcGxlIGxpbmVhciByZWdyZXNzaW9ucyB0byB0ZXN0IGlmIHRoZSBwcmVkaWN0b3JzIHNpZ25pZmljYW50bHkgcHJlZGljdCBlYWNoIGludGVsbGlnaWJpbGl0eSBtZWFzdXJlIG9uIHRoZWlyIG93biAoVlNEIDI1IGFuZCBWU0EgbW9kZWxzIHdlcmUgYWxyZWFkeSBjb21wbGV0ZSBpbiBvdXIgaW5pdGlhbCBtb2RlbCBjb21wYXJpc29uIGFwcHJvYWNoKQoKIyMjIE9ydGhvZ3JhcGhpYyBUcmFuc2NyaXB0aW9uIE1vZGVscwoKYGBge3J9CgojIE9UIH4gVlNEIDc1CgpPVF92c2Q3NV9tb2RlbCA8LSBsbSh0cmFuc0FjYyB+IEh1bGxfYlZTRF83NSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX3ZzZDc1X21vZGVsKQpzdW1tYXJ5KE9UX3ZzZDc1X21vZGVsKQoKIyBPVCB+IEh1bGwKCk9UX2h1bGxfbW9kZWwgPC0gbG0odHJhbnNBY2MgfiBIdWxsX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChPVF9odWxsX21vZGVsKQpzdW1tYXJ5KE9UX2h1bGxfbW9kZWwpCgojIE9UIH4gQ29ybmVyIERpc3BlcnNpb24KCk9UX2Rpc3BfbW9kZWwgPC0gbG0odHJhbnNBY2MgfiB2b3dlbF9FRF9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoT1RfZGlzcF9tb2RlbCkKc3VtbWFyeShPVF9kaXNwX21vZGVsKQoKYGBgCgojIyMgVkFTIE1vZGVscwoKYGBge3J9CgojIFZBUyB+IFZTRCA3NQoKVkFTX3ZzZDc1X21vZGVsIDwtIGxtKFZBUyB+IEh1bGxfYlZTRF83NSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU192c2Q3NV9tb2RlbCkKc3VtbWFyeShWQVNfdnNkNzVfbW9kZWwpCgojIFZBUyB+IEh1bGwKClZBU19odWxsX21vZGVsIDwtIGxtKFZBUyB+IEh1bGxfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU19odWxsX21vZGVsKQpzdW1tYXJ5KFZBU19odWxsX21vZGVsKQoKIyBWQVMgfiBDb3JuZXIgRGlzcGVyc2lvbgoKVkFTX2Rpc3BfbW9kZWwgPC0gbG0oVkFTIH4gdm93ZWxfRURfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU19kaXNwX21vZGVsKQpzdW1tYXJ5KFZBU19kaXNwX21vZGVsKQoKCmBgYAojIExpc3RlbmVyIERlbW9ncmFwaGljIEluZm9ybWF0aW9uCgpgYGB7cn0KCkxpc3RlbmVyRGVtbyA8LSBMaXN0ZW5lcnMgJT4lCiAgZnVybml0dXJlOjp0YWJsZTEoYWdlLCBnZW5kZXIsIHJhY2UsIGV0aG5pY2l0eSkKCkxpc3RlbmVyRGVtbwoKYGBgCgojIFNwZWFrZXIgRGVtb2dyYXBoaWNzCgpgYGB7cn0KClNwZWFrZXJEZW1vIDwtIEFjb3VzdGljRGF0YSAlPiUKICBkcGx5cjo6c2VsZWN0KGMoU3BlYWtlciwgU2V4LCBFdGlvbG9neSkpCgpBZ2VzIDwtIHJpbzo6aW1wb3J0KCJQcmVwcGVkIERhdGEvU3BlYWtlciBBZ2VzLnhsc3giKQoKU3BlYWtlckRlbW8gPC0gZnVsbF9qb2luKFNwZWFrZXJEZW1vLCBBZ2VzLCBieSA9ICJTcGVha2VyIikKClNwZWFrZXJEZW1vSW5mbyA8LSBTcGVha2VyRGVtbyAlPiUKICBmdXJuaXR1cmU6OnRhYmxlMShTZXgsIEV0aW9sb2d5LCBBZ2UsIG5hLnJtID0gRikKClNwZWFrZXJEZW1vSW5mbwoKU3BlYWtlckRlbW8gJT4lCiAgZHBseXI6OnN1bW1hcml6ZShtZWFuX2FnZSA9IG1lYW4oQWdlLCBuYS5ybSA9IFQpLCBhZ2Vfc2QgPSBzZChBZ2UsIG5hLnJtID0gVCksIGFnZV9yYW5nZSA9IHJhbmdlKEFnZSwgbmEucm0gPSBUKSkKCmBgYAoK